2013-03-20 2 views
0

Я создал окно и поток в моем приложении. Теперь я хочу, чтобы поток обрабатывал некоторые данные и отображал их в главном окне. Для этой цели я использовал функцию PostMessage() в моей теме. Т.е. создается окно, затем создается поток. Поток применяет некоторую обработку данных и отправляет сообщение в главное окно, что данные должны отображаться сейчас. Но проблема в том, что для этой цели мне придется пройти ручку Window, хотя для этого потока Main Window Handle является незанятым IDENTIFIER. Есть ли какой-либо возможный способ, с помощью которого я могу передать дескриптор Main Window в мой поток, чтобы с помощью этой Handle Thread мог опубликовать сообщение. Ниже приведен фрагмент кода для любой помощи:Paasing Окно Обращение к потоку в C. (WIN32 API)

///Thread Function//// 
DWORD WINAPI threadFunction(LPVOID param) 
{ 
    //do something 
    PostMessage(hMainWin, WM_thread,0, 0); 
    return true; 
} 

////Main Function/// 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    const char AH_Glb_ClassName[] = "myWindClass"; 
    WNDCLASSEX wc; 
    MSG Msg; 
    //Registering the Window Class 
    wc.cbSize  = sizeof(WNDCLASSEX); 
    wc.style   = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance  = NULL; 
    wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = AH_Glb_ClassName; 
    wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 
    HWND hMainWin;  //Handle to Main WIndow 
    ///Creating Main Window/// 
    hMainWin = CreateWindowEx(          WS_EX_CLIENTEDGE, 
             AH_Glb_ClassName, 
             "I am SERVER Window", 
             WS_OVERLAPPEDWINDOW, 
             CW_USEDEFAULT, 
             CW_USEDEFAULT, 
             440, 
             120, 
             NULL, NULL, NULL, NULL); 
    if(hMainWin == NULL) 
     { 
     MessageBox(NULL, 
        "Window Creation Failed!", 
        "Error!", 
        MB_ICONEXCLAMATION | 
        MB_OK); 
     return 0; 
     } 
    ShowWindow(hMainWin,SW_MAXIMIZE); 
    UpdateWindow(hMainWin); 
    /////////////////THREAD//////////////// 
    DWORD threadID = 0; 
    ///Creating Thread/// 
    HANDLE threadHandle = CreateThread(NULL, 
             0, 
             threadFunction, 
             0, 
             0, 
             &threadID); 

    return 0; 
} 
+3

Помните, что функции потока принимают аргумент. Передайте дескриптор в качестве аргумента. –

+0

Я тоже это пробовал, но поскольку этот аргумент является типом DWORD, а Handle to window является HWND-типом, поэтому я не могу передать Window Handle в качестве аргумента функции потока. :( – Ayse

+2

Аргумент аргумента имеет тип LPVOID, то же, что и HANDLE. –

ответ

7
DWORD WINAPI threadFunction(LPVOID param) 
{ 
    HANDLE hwnd = (HANDLE)param; 
} 

... 

HANDLE threadHandle = CreateThread(NULL, 
            0, 
            threadFunction, 
            (LPVOID)hMainWin, 
            0, 
            &threadID); 

функция Thread имеет LPVOID тип, он совпадает с HANDLE типа, как в Win32 и x64.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

BTW, вам нужно добавить цикл обработки сообщений в WinMain.

+0

Спасибо, это сработало :) – Ayse

Смежные вопросы