实时搜索: mfc主线程在哪

mfc主线程在哪

560条评论 1801人喜欢 6150次阅读 689人点赞
首先,我创建了一个MFC的对话框工程。
我创建了一个子线程,然后子线程循环接收数据
我希望每次接收到的数据,都可以在DLG的编辑窗口中显示。

可是,我不清楚怎么取显示?
我想调用SetWindowText函数,可是他还让我输入一个参数句柄。
我感觉这个句柄应该是编辑窗口的句柄,但是我不清楚怎么获取?

这个功能到底怎么实现呢?

就是在子线程中获取数据,然后在主线程的对话框的编辑窗口显示。 , 我在MFC推箱子,主线程最短路径 主线程想走完一步 停一下
需要重新创建一个线程?请稍微讲详细一点!...

为什么mfc主线程执行结束后才执行子线程: 一个程序从入口函数开始运行,知道运行到末尾的 return结束,程序退出。这是一个很正常的过程,如果你不告诉程序停止向下执行语句,他会始终向下执行直到return。

等待事件一般就可以停止运行代码,但是最好不要写在主线程里,容易引起关闭时候不正当现象。

一般windows窗口程序为什么不会有楼主这问题呢,因为窗口程序本身就是一个死循环程序,永远不会自动退出,除非接收到了特定的退出消息。

楼主如果是一个普通的测试程序的话,可以再程序末尾加一个死循环防止程序退出,又处于对性能的考虑,在循环中睡眠10秒。
while(1)
{
Sleep(10000);
}
-----------------
那不应该,对话框程序本身就是一个窗口程序,mfc工程下生成的会有个dlg.DoModal()函数来保持程序不会退出。

当对话框退出的话,那只有以下几种可能:
1. 按下对话框上的 ‘确定’或‘取消’按钮,他会执行对话框类里的虚函数OnOk 或 OnCancel函数,这2个函数都会使对话框退出。

2.按下了窗口'x'按钮,这个和‘取消’差不多。

3.ctrl+alt+del 强行关闭

4.其他非正当错误(比如内存错误,有错误提示)导致的程序崩溃退出。

5.线程发送消息告知主线程退出。(如果不是特意这么写,vc编译器不会自动写的)
线程的正常退出不会影响到其他线程(包括主线程)。

这里只能推测楼主把建立线程写在了 确定 按钮里了吧

在MFC的子线程中,去操作主线程的编辑窗口: 句柄指明了你要更新哪一个窗口。平时所说的“控件”,其实Windows下都叫“窗口”

如果你用类向导为这些控件创建了控件类型的变量,那么直接用这些变量操作就行了(创建线程的时候不是可以传递一个线程参数吗,在主窗口把this传进去就是了。然后从this就可以取到这个“控件变量”,直接在它上面调用SetWindowText方法而不是调用SetWindowText API,就不需要“句柄”了

mfc 中 主线程进行过程中 想停下来一会,再进行 急急急: DWORD dwThreadID = 0;
HANDLE hThread=CreateThread(NULL,0,Thread,0,NULL,&dwThreadID);//创建线程
使用EVENT 线程调API函数WaitForSingleObject来等待该事件时就挂起了.当你需要该线程处理什么时,使用SetEvent来激活该事件,则线程被释放,这样就激活了.而被挂起后的线程不会被运行,所以不能自己激活,只能通过其它线程来激活

MFC:MFC当从主对话框中弹出新对话框后,会开辟一个新线程,并阻塞主线程在DoModal()方法处,对吧?: 当弹出的是模态对话框时,就像你说的那样,主线程的DoModal()被阻塞;

怎么在基于对话框的MFC程序中实现多线程?: 基于MFC的对话框程序加启动进度条(转)
对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等。
这些启动画面在Visual C++中怎么实现呢?对于文档/视图结构的程序,可以直接使用VC提供的SplashWnd组件。可是在基于对话框的程序却不能使用SplashWnd组件。因此只能自己来实现此功能。
因为显示启动画面的同时还要进行程序的加载工作,所以要用到多线程。MFC区分了两种不同类型的多线程:用户界面(UI)线程和工作者线程。两者的区别是UI线程有消息循环,而工作者线程没有,UI线程能够创建窗口并处理发送给窗口的消息。工作者线程用来执行后台任务,这些后台任务不直接接受用户输入,因此不需要窗口和消息循环。 因为这里要显示一个画面,所以要使用UI线程。

下面结合我做的一个小软件“实用闹钟”来说明如何为对话框程序制作启动画面。
打开Visual C++建立一个对话框工程Page.
首先准备一副位图资源插入到工程中,作为启动时显示的画面。再插入一个对话框,设置ID为IDD_SPLASH。在上面放一个picture控件,类型设为”Bitmap”,图象选择刚才插入的位图。
设置对话框的Style为Popup,Border 为None,去掉Title Bar属性,并调整对话框的大小与位图等大,这样对话框显示的时候,你看到的只是图片。打开 ClassWizard为此对话框建立一个新类CSplashDlg, 基类为CDialog.
UI线程是由一个动态可创建的类来控制,该类是从CWinThread派生的,非常类似从CWinApp派生的一个应用程序类.打开ClassWizard建立一个由CWinThread派生的类----CSplashThread,在SplashThread.h 中加入 #include"SplashDlg.h",并添加一个protected型指针变量:
CSplashDlg* m_pSplashDlg; //声明一个对话框指针

下面我们将在UI线程的InitInstance()函数中调用刚才创建的对话框并显示。
BOOL CSplashThread::InitInstance()
{
::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE );
//:通常系统内的每个线程都有自己的输入队列。本函数允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 . (这个函数可以不用)
m_pSplashDlg=new CSplashDlg;
m_pSplashDlg->SetEnable(true);
m_pSplashDlg->Create(IDD_SPLASH);
m_pSplashDlg->ShowWindow(SW_SHOW);
return true;
}

为CSplashThread类添加一个函数HideSplash(), 用来隐藏启动画面(即关闭对话框)
void CSplashThread::HideSplash()
{
m_pSplashDlg->SendMessage(WM_CLOSE);
}

在ExitInstance()中释放资源:
int CSplashThread::ExitInstance()
{
m_pSplashDlg->DestroyWindow();
delete m_pSplashDlg;
return CWinThread::ExitInstance();
}

在应用程序类CPageApp中包含头文件: #include “SplashThread.h”
并添加两个变量:
public: //设为pulic类型,是为了在其他类中能够访问
CSplashThread* pSplashThread;
CSplashDlg* m_pSplashDlg;

在InitInstance()中启动UI线程:
pSplashThread = (CSplashThread*) AfxBeginThread(
RUNTIME_CLASS(CSplashThread),
THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED);
ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
pSplashThread->ResumeThread();
Sleep(1);

为了让程序一起动就显示启动画面,这段代码应该放在InitInstance()最开头的地方.
启动画面是显示了,可是结束代码应该放在什么地方呢?如果放在InitInstance()的CPageDlg dlg; m_pMainWnd = &dlg; 后面,即在构造了主对话框之后隐藏启动画面, 程序运行时会发现,启动画面结束后,还要等一会才能显示出主对话框,这样就达不到启动画面应有的效果. 最好应该在即将显示主对话框的时候隐藏启动画面. 我的这个软件中在主对话框中定义了5个子对话框类的对象,分别是page1,page2,…page5.
程序启动时的流程如下:
Page1构造 --->Page2构造 --->Page3构造---> Page4构造---> Page5构造---> 主对话框构造 --->主对话框初始化---> Page1初始化---> Page2初始化 --->Page3初始化 Page4初始化---> Page5初始化
由此可见,启动画面结束的最好地方应该是在 page5的初始化函数中
BOOL CPage5::OnInitDialog()
{
CDialog::OnInitDialog();
if ( ((CPageApp*)AfxGetApp())->pSplashThread != NULL)
((CPageApp*)AfxGetApp())->pSplashThread->HideSplash();
return TRUE;
}
到此,一个对话框程序的启动画面就这样完成了.由于是用对话框作为启动画面,所以你可以你可以发挥你的想象力,在对话框上设计出丰富多才的效果来,比如加上Flash,Gif动画等.

MFC 线程函数之间的跳转问题?: 线程调用后,线程和成员函数是同时执行的!
你可以使用线程间通讯的方式来等待线程执行完后再继续。

MFC中在主对话框创建了个线程,同时创建了个全局的互斥量,但是为什么我的线程中总是等不到互斥量呢?: 创建互斥量在创建的时候就被加锁了吧?

VC线程函数的返回值: WINDOWS操作系统总是将HWND窗口句柄同创建它的线程进行关联。并且在很多文档中再三强调,窗口处理函数应该放在一个线程中进行调用,这个线程就是创建窗口的线程。
诸如一些训诫指出--最好把所有的窗口创建都放在主线程中,不要在多个线程中进行窗口创建和函数处理,响应用户界面的消息处理在主线程中进行,将和用户界面无关的工作放在其他线程中进行,这些其他线程又派生出工作线程和后台线程的概念。不管如何叫法,其中心思想还是如开始所说,不要在多线程中处理HWND。
MFC也有这样的原则,因此简单将窗口类指针,如CWnd*,CEdit*传给新线程,其调用可能会正常,可能就会断言失败。
楼主看下MSDN的说明,里面明确提出,在新线程中,可以将HWND传给新线程,而不是窗口类指针。基于这样的说明正常处理应该是:
1)分配全局缓存,用来存储ListCtrl的文本信息。
TCHAR GlobalBuffer[200];

2)定义自定义消息
#define WM_GETMYTEXT (WM_USER + 10)

3)映射自定义消息函数
BEGIN_MESSAGE_MAP(CMyWindow, CDialog)
ON_MESSAGE(WM_GETMYTEXT, OnGetText)
END_MESSAGE_MAP

4)定义自定义消息函数
HRESULT CMyWindow::OnGetText(WPARAM wParam, LPARAM lParam)
{
this->m_list.GetItemText((int)wParam, (int)lParam, GlobalBuffer, 200);
return 0L;
}

5)将窗口句柄传给新线程

6)在新线程中获取文本
int row = 3;
int col = 4;
SendMessage(hwndList, WM_GETMYTEXT, (WPARAM)row, (LPARAM)col);

以上是个大概的思想可以灵活使用,譬如WPARAM和LPARAM可以充分利用,另外就是SendMessage是有返回值的,这个返回值也可以利用,返回值就是CMyWindow::OnGetText中return 的HRESULT值。

  • 14全国执业医师成绩哪里查

    贩卖毒品小麻0.7克一般会罚款多少钱,判刑多长时间: 贩卖鸦 片不满二百克、海 洛因或者甲基 苯丙胺不满十克或者其他少量毒品的,处三年以下有期徒刑、拘役或者管制,并处罚金;情节严重的,处三年以上七年以下有期徒刑,并处罚金。 ...

    932条评论 2379人喜欢 1979次阅读 580人点赞
  • minus怎么读

    轩尼诗杯莫停干邑白兰地0.7公升酒精40度多少钱: 轩尼诗百乐廷干邑白兰地 Hennessy Paradis Rare Cognac 700ml   酒窝网售价:6888元 ...

    749条评论 4393人喜欢 3595次阅读 731人点赞
  • pdf为什么损坏

    轩尼诗杯莫停干邑白兰地0.7公升酒精40度多少钱: gjcghcghfghgfg ...

    530条评论 6235人喜欢 3059次阅读 369人点赞
  • 1980年2元钱值多少钱

    南丹县水电多少钱一度?因为我刚刚来到南丹县不知道,昨天房东收了我5元的水费一度,0.7的电费,这是: 水太贵了,正常是3--3.5元/方。 ...

    844条评论 2086人喜欢 5937次阅读 866人点赞
  • 2018年买什么股

    一个彩色粉笔3.4元.一盒彩色粉笔比一盒白色粉笔贵0.7元,买一盒彩色粉笔和一盒白色粉笔共需要多少钱?: 白色粉笔 3.4-0.7彩色粉笔3.43.4+3.4-0.7=6.1买一盒彩色粉笔和一盒白色粉笔共需要6.1元 ...

    721条评论 4663人喜欢 2247次阅读 912人点赞
  • ios9和8哪个卡

    丁丁买练习本.买6本钱还剩0.7元.买8本钱又差0.3元.问每本多少元: 用方程:设每本练习本的价钱为x元,则由题意可得:6x+0.7=8x-0.3解得:x=0.5所以每本练习本为0.5元 ...

    395条评论 5507人喜欢 3777次阅读 975人点赞