CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  控件与界面

多线程中InitInstance()中怎样创建界面?

楼主wdf2()2000-08-20 09:05:00 在 PowerBuilder / 控件与界面 提问

 
      请给例子。是用非模对话框   ?   MDI子窗体   ?  
   
  问题点数:75、回复次数:6Top

1 楼Holly()回复于 2000-08-21 00:37:00 得分 0

你问这样的问题,是不知道UI线程的真正原理!  
  例子我懒得给,因为实在简单,而且与你用非模式对话框和MDI框架窗口无关!  
  你可以随便建立一个MFC的应用程序,然后新建一个继承CWinThread的类,在该类的InitInstance()中把MFC缺省的产生的主程序中的::InitInstance中有关窗口初始化的代码拷贝过来MDI和SDI程序通常如下:  
  CMainFrame*   pMainFrame   =   new   CMainFrame;  
  if   (!pMainFrame->LoadFrame(IDR_MAINFRAME))  
      return   FALSE;  
  m_pMainWnd   =   pMainFrame;  
  pMainFrame->UpdateWindow();  
   
  将你继承的类在需要的地方声明(比如:在主程序中声明成员变量m_UIThread)  
  在你希望启动的地方添加:  
  if(m_UIThread.InitInstance())  
  {  
          m_UIThread.Run();  
  }  
   
  你会看到什么?  
  出现了两个程序界面!  
  当然这时的程序是有问题的,因为缺省的线程类的Run()函数调用了OnIdle,如果你不作处理,会导致关闭窗口时出现断言错误!不会当机!简单的处理是重载Run()函数,将OnIdle的调用加以修改或干脆去掉!  
  还有程序的文档模板没有在线程中加入,所以有关文档的处理会怪怪的到主程序中去!当然没必要处理这些问题,你不会用这样的处理方式。  
  我主要是想让你知道;  
  UI线程和工作线程实际上是一样的,如果你在工作线程中循环调用GetMessage(),TranslateMessage(),DispatchMessage()进行消息的分发处理的话,跟UI线程就一样了;  
  实际上,从Windows   SDK的角度上来说,是没有区别的,都是一个循环;  
   
  如果你愿意,你可以将MFC生成的框架程序中的::InitInstance()中的全部代码删掉,然后用一个一定退出条件的循环替代,程序就变成了纯粹的工作进程;  
   
  只有一点提醒你注意的是,如果你仔细跟踪CDialog::DoModal()的代码你就知道,实际上它就是自己在循环取消息处理,所以模式对话框不能简单的象上述那样拷贝,因为它阻塞了线程的消息循环自己处理因此要另外处理,方法我就不举例了等你理解了UI线程的原理自然就知道如何处理了;  
  如果还不明白,继续问!Top

2 楼wdf2()回复于 2000-08-21 13:57:00 得分 0

给您又加了25分,谢谢   !  
  请给出   1.非模式对话框       2.pDocTemplate->OpenDocumentFile(NULL);   即调用主线程中  
  多文档模板生成子窗体     来形成多线程的例子.  
   
  我买了一本书,它UI线程部分未讲清,不想再买新书了。     请支持.   Top

3 楼Holly()回复于 2000-08-21 19:18:00 得分 0

首先我需要质疑你的需求,为何要如此,你要知道MFC的消息映射表是线程局部存储的,按照你的说法,似乎想要跨线程使用。Top

4 楼wdf2()回复于 2000-08-22 08:08:00 得分 0

 
  UI   线程最常用的UI是何类型,给出代码例子,不就完了   !  
   
  谢谢   !Top

5 楼Holly()回复于 2000-08-22 15:52:00 得分 75

对话框的例子!  
  先以你的程序的AboutDlg为例:  
  在你的CAboutDlg中重载OnOK和OnCancel函数,添加对PostQuitMessage()的调用;  
  (当然如此改动之后,原来在App中的调用就应当注释,不过只是试验,没关系)  
   
  新建一个类CDlgThread,继承CWinThread;  
  声明成员变量:  
      CAboutDlg   m_DlgThread;  
  在CDlgThread::InitInstance()中添加:  
          m_dlgAbout.Create(CAboutDlg::IDD);  
          m_pMainWnd   =   &m_dlgAbout;  
          m_dlgAbout.ShowWindow(SW_SHOW);  
          m_dlgAbout.UpdateWindow();  
   
  建立一个菜单用来专门创建线程,我暂且借用ID_FILE_OPEN那么代码如下:  
  void   C*App::OnFileOpen()  
  {  
          CDlgThread     dlgThread;  
          if   (dlgThread.InitInstance())  
          {  
                  dlgThread.Run();  
          }  
  }  
   
  此时你每点击文件打开一次,就出现一个About对话框;  
  Top

6 楼wdf2()回复于 2000-08-22 18:44:00 得分 0

Holly大侠:  
      最常用的UI线程是否就是非模式对话框   ?   使用MDI的子窗体中的childframe或formview行吗?  
  若有例子最好   !  
   
      我的另一贴子“怎样在   CMDIMainFrame   的客户区创建   CEdit   控件   ?”     请您继续支持,  
  明天一并给分(共   150).  
      谢谢。  
   
  Top

相关问题

  • 如何创建多线程
  • ADOconnection 多线程 界面死掉
  • 在多线程中如何创建CSOCKET???
  • 如何用多线程创建视图?
  • 请问如何创建多线程?
  • V中如何创建多线程?
  • 多线程和界面通讯的问题
  • 界面多线程的例子,高手请入!
  • 如何用API32 在 VB6中创建多线程!难道vb不能创建多线程吗?
  • 怎么在vb中创建多线程阿!!

关键词

  • 线程
  • 代码
  • 函数
  • 文档
  • 循环
  • 模式
  • 消息
  • mfc
  • initinstance
  • 对话框

得分解答快速导航

  • 帖主:wdf2
  • Holly

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

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