100分相送:一个基于对话框的程序,在子线程中创建了一个控件,如果创建成功,整个界面像是死掉了一样,但是子线程还在运行?请看源码
typedef struct tagCOMINFO
{
bool bValid;
char szName[5];
long lRate;
CEdisonEasySms *pOcx;
CComPortRouter *pThis;
//CWnd *pNotifyWnd;
HWND hMainWnd;
int nThreadIdx;
}COMINFO;
unsigned int __stdcall SmsSendProc(LPVOID pParam)
{
// EnterCriticalSection(&g_cs);
COMINFO *pstuCOMINFO = (COMINFO *)pParam;
// LeaveCriticalSection(&g_cs);
static int nCreateOcx = 0;
while (true)
{
if (WaitForSingleObject(pstuCOMINFO->pThis->m_hStopEvent, 100) != WAIT_TIMEOUT)
{
TRACE("收到StopEvent");
break;
}
if (nCreateOcx == 0)
{
//CoInitializeEx(NULL, COINIT_MULTITHREADED);
CString szClassName, szWindowName;
szClassName.Format("EDIDONOCX%d", pstuCOMINFO->nThreadIdx);
szWindowName.Format("HI%d", pstuCOMINFO->nThreadIdx);
CEdisonEasySms *pocxSender = NULL;
pocxSender = new CEdisonEasySms;
if (pocxSender->Create(szClassName, szWindowName, WS_CHILD, CRect(0, 0, 20, 20), CWnd::FromHandle(pstuCOMINFO->hMainWnd), 1234 + pstuCOMINFO->nThreadIdx))
{
EnterCriticalSection(&g_cs);
TRACE("---------------------1\n");
pstuCOMINFO->pOcx = pocxSender;
nCreateOcx = 1;
TRACE("---------------------2\n");
//UpdateData()
//CWnd::FromHandle(pstuCOMINFO->hMainWnd)->RedrawWindow();
LeaveCriticalSection(&g_cs);
}
//CoUninitialize();
}
TRACE("---------------------3\n");
}
}
另外还有一个小问题:我用for循环创建了上面的比如十个线程,为什么好像老是在一个,有时二个线程中运行,其它的线程几乎没有进入过?请帮忙
问题点数:100、回复次数:7Top
1 楼striking(庸人自扰)回复于 2006-03-15 10:23:03 得分 0
线程要有消息循环, 线程应该继承CWinThreadTop
2 楼islyb_3()回复于 2006-03-15 10:31:28 得分 0
具体如何来做呢?谢谢Top
3 楼ydfivy(我就是一送外卖的)回复于 2006-03-15 10:40:17 得分 0
子线程最好发消息给主线程.让主线程去创建控件.Top
4 楼striking(庸人自扰)回复于 2006-03-15 10:58:51 得分 0
看看这个能不能符合你的要求
http://www.codeproject.com/threads/extended_thread.aspTop
5 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-15 14:54:00 得分 0
不要阻塞主线程。用MsgWaitForMultipleObjects。参考http://blog.joycode.com/jiangsheng/archive/2005/08/20/62256.aspxTop
6 楼jjiaming(阿熊)回复于 2006-03-15 18:30:24 得分 0
在循环中加Sleep语句,你的线程一执行就在不停的循环,主线程甚至于其他的程序都无法得到CPU,而你所说的十个线程只有一两个线程在运行也是这个道理Top
7 楼forover(天下无吥散dě宴席)回复于 2006-03-15 18:36:43 得分 0
最好的方法还是线程发送消息给主线程,创建控建的事叫主线程来完成Top




