要求主线程和从线程之间用消息进行通讯, 看的书上主线程都是界面线程. 请问: 如果写一个没有界面的, 比如Win32控制台程序, 主线程和从线程之间还能用消息进行通讯吗? 消息通讯机制在只能在Win32项目中进行吗?这方面的只是比较弱, 问题可能比较白痴. 请各位大大包涵, 谢谢!

解决方案 »

  1.   

    windows的消息泵必须依附于窗口,你可以在控制台程序的线程内建立一个不可见的窗口,别的线程得到其句柄后就可以发送消息了,比如:
    hThreadWnd = CreateWindowEx(WS_EX_TOOLWINDOW, wndclass.lpszClassName,
                                           "", WS_POPUP, 0, 0, 0, 0, 0, 0,gvInstance, NULL);
    其中式各样wndclass是WNDCLASS结构的变量,其它参数的意义自己查msdn。这样别的线程就可以SendMessage(hThreadWnd,...)了
      

  2.   

    PostThreadMessage符合你的要求,MSDN或者搜下用法就出来了。
      

  3.   

    建立不可见的窗口,用PostThreadMessage发送。
      

  4.   

    消息处理必须要有窗口,即使是PostThreadMessage,虽然是向线程发送消息,但是接收线程也要有消息循环语句和消息处理函数才能处理啊
      

  5.   

    难道主线程中不能这么写吗:
    int main()
    {
        MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
            swtich(msg.message)
            {
            case WM_USERDEF1:
                // do something;
                break;
            case WM_USERDEF1:
                // do something;
                break;
            case WM_USERDEF1:
                // do something;
                break;
            default: 
                break;
            }
        }
        return 0;
    }
      

  6.   

    #include <stdio.h>
    #include <windows.h>
    #include <iostream.h>
    #include <process.h>#define UM_MSG1 WM_USER+1
    #define UM_MSG2 WM_USER+2DWORD WINAPI Thread1(LPVOID para)
    {

    DWORD dwThreadId = *(DWORD *)para;
    DWORD i=0;
    TCHAR *p;
    char strTmp[100];

    while(TRUE)
    {
    Sleep(1700);
    p=new TCHAR[10];
    sprintf(strTmp,"Hello %d %x",i++,p);
    PostThreadMessage(dwThreadId,UM_MSG1,(WPARAM)strTmp,(LPARAM)p);
    //delete []p;
    }

    return 0;

    }DWORD WINAPI Thread2(LPVOID para)
    {

    char strTmp[100];
    DWORD dwThreadId = *(DWORD *)para;
    DWORD i=0;
    TCHAR *p;
    while(TRUE)
    {

    Sleep(3000);
    p=new TCHAR[10];
    sprintf(strTmp,"World %d %x",i++,p);
    PostThreadMessage(dwThreadId,UM_MSG2,(WPARAM)strTmp,(LPARAM)p);
    delete []p;
    }

    return 0;

    }int main()
    {

    DWORD dwValue =GetCurrentThreadId();
    HANDLE hThread1 = CreateThread(NULL,0,&Thread1,&dwValue,0,NULL);
    HANDLE hThread2 = CreateThread(NULL,0,&Thread2,&dwValue,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
    switch(msg.message)
    {
    case UM_MSG1:
    case UM_MSG2:
    printf("msg:0x%x      w:%x   ws:%s  l:%x\n",msg.message,&msg.wParam,msg.wParam,msg.lParam);
    delete [](TCHAR *)msg.lParam;  //注释掉这句你就会看到堆内存地址变化
    break;
    default:
    printf("Unknown msg:0x%x\n",msg.message);
    break;
    }
    Sleep(1);
    }
    return 0;
      

  7.   

    #include <stdio.h>
    #include <windows.h>
    #include <iostream.h>
    #include <process.h>#define UM_MSG1 WM_USER+1
    #define UM_MSG2 WM_USER+2DWORD WINAPI Thread1(LPVOID para)
    {

    DWORD dwThreadId = *(DWORD *)para;
    DWORD i=0;
    TCHAR *p;
    char strTmp[100];

    while(TRUE)
    {
    Sleep(1700);
    p=new TCHAR[10];
    sprintf(strTmp,"Hello %d %x",i++,p);
    PostThreadMessage(dwThreadId,UM_MSG1,(WPARAM)strTmp,(LPARAM)p);
    //delete []p;
    }

    return 0;

    }DWORD WINAPI Thread2(LPVOID para)
    {

    char strTmp[100];
    DWORD dwThreadId = *(DWORD *)para;
    DWORD i=0;
    TCHAR *p;
    while(TRUE)
    {

    Sleep(3000);
    p=new TCHAR[10];
    sprintf(strTmp,"World %d %x",i++,p);
    PostThreadMessage(dwThreadId,UM_MSG2,(WPARAM)strTmp,(LPARAM)p);
    //delete []p;
    }

    return 0;

    }int main()
    {

    DWORD dwValue =GetCurrentThreadId();
    HANDLE hThread1 = CreateThread(NULL,0,&Thread1,&dwValue,0,NULL);
    HANDLE hThread2 = CreateThread(NULL,0,&Thread2,&dwValue,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
    switch(msg.message)
    {
    case UM_MSG1:
    case UM_MSG2:
    printf("msg:0x%x      w:%x   ws:%s  l:%x\n",msg.message,&msg.wParam,msg.wParam,msg.lParam);
    delete [](TCHAR *)msg.lParam;  //注释掉这句你就会看到堆内存地址变化
    break;
    default:
    printf("Unknown msg:0x%x\n",msg.message);
    break;
    }
    Sleep(1);
    }
    return 0;
      

  8.   

    感谢 zyq5945, 我先看看你的代码!
      

  9.   

    感谢各位朋友, CSDN真是万能的!