Implementing events to communicate between two processes - C

Posted by Jamie Keeling on Stack Overflow See other posts from Stack Overflow or by Jamie Keeling
Published on 2010-04-22T13:43:11Z Indexed on 2010/04/22 17:53 UTC
Read the original article Hit count: 237

Filed under:
|
|
|
|

Hello all!

I have an application consisting of two windows, one communicates to the other and sends it a struct constaining two integers (In this case two rolls of a dice).

I will be using events for the following circumstances:

  • Process a sends data to process b, process b displays data
  • Process a closes, in turn closing process b
  • Process b closes a, in turn closing process a

I have noticed that if the second process is constantly waiting for the first process to send data then the program will be just sat waiting, which is where the idea of implementing threads on each process occurred and I have started to implement this already.

The problem i'm having is that I don't exactly have a lot of experience with threads and events so I'm not sure of the best way to actually implement what I want to do.

Following is a small snippet of what I have so far in the producer application;

Create thread:

case IDM_FILE_ROLLDICE:
            {
hDiceRoll = CreateThread(
                    NULL,       // lpThreadAttributes (default)
                    0,          // dwStackSize (default)
                    ThreadFunc(hMainWindow), // lpStartAddress
                    NULL,       // lpParameter
                    0,          // dwCreationFlags
                    &hDiceID    // lpThreadId (returned by function)
                    );
            }
            break;

The data being sent to the other process:

DWORD WINAPI ThreadFunc(LPVOID passedHandle)
{
    HANDLE hMainHandle = *((HANDLE*)passedHandle);

    WCHAR buffer[256];
    LPCTSTR pBuf;

    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;

    struct diceData storage;
    HANDLE hMapFile;

    DWORD dw;
    //Roll dice and store results in variable
    storage = RollDice();

    hMapFile = CreateFileMapping(
        (HANDLE)0xFFFFFFFF,    // use paging file
        NULL,                    // default security 
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD) 
        BUF_SIZE,                // maximum object size (low-order DWORD)  
        szName);                 // name of mapping object

    if (hMapFile == NULL) 
    { 
        dw = GetLastError();    
        MessageBox(hMainHandle,L"Could not create file mapping object",L"Error",MB_OK);
        return 1;
    }
    pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,                   
        0,                   
        BUF_SIZE);           

    if (pBuf == NULL) 
    { 
        MessageBox(hMainHandle,L"Could not map view of file",L"Error",MB_OK);

        CloseHandle(hMapFile);

        return 1;
    }


    CopyMemory((PVOID)pBuf, &storage, (_tcslen(szMsg) * sizeof(TCHAR)));
    //_getch();

    MessageBox(hMainHandle,L"Completed!",L"Success",MB_OK);

    UnmapViewOfFile(pBuf);

    return 0;
}

I'm trying to find out how I would integrate an event with the threaded code to signify to the other process that something has happened, I've seen an MSDN article on using events but it's just confused me if anything, I'm coming up on empty whilst searching on the internet too.

Thanks for any help

Edit:

I can only use the Create/Set/Open methods for events, sorry for not mentioning it earlier.

© Stack Overflow or respective owner

Related posts about c

    Related posts about winapi