关于线程间用消息进行通讯的问题 要求主线程和从线程之间用消息进行通讯, 看的书上主线程都是界面线程. 请问: 如果写一个没有界面的, 比如Win32控制台程序, 主线程和从线程之间还能用消息进行通讯吗? 消息通讯机制在只能在Win32项目中进行吗?这方面的只是比较弱, 问题可能比较白痴. 请各位大大包涵, 谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windows的消息泵必须依附于窗口,你可以在控制台程序的线程内建立一个不可见的窗口,别的线程得到其句柄后就可以发送消息了,比如:hThreadWnd = CreateWindowEx(WS_EX_TOOLWINDOW, wndclass.lpszClassName, "", WS_POPUP, 0, 0, 0, 0, 0, 0,gvInstance, NULL);其中式各样wndclass是WNDCLASS结构的变量,其它参数的意义自己查msdn。这样别的线程就可以SendMessage(hThreadWnd,...)了 PostThreadMessage符合你的要求,MSDN或者搜下用法就出来了。 建立不可见的窗口,用PostThreadMessage发送。 消息处理必须要有窗口,即使是PostThreadMessage,虽然是向线程发送消息,但是接收线程也要有消息循环语句和消息处理函数才能处理啊 难道主线程中不能这么写吗: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;} #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;} #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;} 感谢 zyq5945, 我先看看你的代码! 感谢各位朋友, CSDN真是万能的! MFC 控件开发 CListCtrl的问题 请问各位高人,单文档程序如何作出这个界面效果 再次问一个文件打开和转换的问题? 如何向word插入自定义工具栏并且定义点击后的事件(vc)? 异步通讯,,如何知道对方是否已经受到我send()的东西? 请问:输入法的各窗体是如何定位的啊?为什么GetCaretPos函数在word中的返回值都是0啊? SOS!!! 关于OnChar()函数方面的小问题,请大家进来看看,谢谢! 如何设置edit box中的光标位置 float和double用什么VT类型来表示呢? wince6.0 mfc怎样从对话框类访问视图类?
hThreadWnd = CreateWindowEx(WS_EX_TOOLWINDOW, wndclass.lpszClassName,
"", WS_POPUP, 0, 0, 0, 0, 0, 0,gvInstance, NULL);
其中式各样wndclass是WNDCLASS结构的变量,其它参数的意义自己查msdn。这样别的线程就可以SendMessage(hThreadWnd,...)了
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;
}
#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;
}
#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;
}