CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

100分相送:一个基于对话框的程序,在子线程中创建了一个控件,如果创建成功,整个界面像是死掉了一样,但是子线程还在运行?请看源码

楼主islyb_3()2006-03-15 10:17:44 在 VC/MFC / 基础类 提问

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

相关问题

  • 如何在线程里用对话框控件对应的变量?如何刷新对话框?
  • *********对话框控件**********
  • 如何在线程函数中操作对话框中的控件
  • 如何在线程中引用对话框里的控件和变量???
  • 如何在线程函数中得到当前对话框中控件的指针!
  • 关于对话框控件的问题?
  • 如何显示控件对话框?
  • 多线程中的对话框问题
  • 关于对话框控件的问题:(
  • 线程和对话框问题

关键词

  • 线程
  • 循环
  • 消息
  • pstucominfo
  • nthreadidx
  • pocxsender
  • 创建
  • cominfo
  • cedisoneasysms
  • ncreateocx

得分解答快速导航

  • 帖主:islyb_3

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo