1. MFC中多线程怎么调用窗口类成员函数
当前界面的线程
AfxGetThread()返回当前界面线程对象的指针(CWinThread类指针).
其中公共成员保存了窗口指针
m_pMainWnd
保存指向应用程序的主窗口的指针
(CWnd)
m_pActiveWnd
当前大亩活动窗口指针(CWnd)
这样你就可以调用窗口的方法了.
不过我个人还是觉得拆野你发消息滚御森比较好一些,消息传递参数可以通过无符号指针的切换来解决.
2. #请教下 mfc中写多线程,应该写在哪个类中,同时mfc的主线程在哪里,小弟初学 还请指教
MFC里AfxBeginThread()可以创建线程,vc里不管是不是MFC,main(在拦岁win32下是WinMain)函数磨扮代码就是简游睁主线程,主线程退出整个进程退出,也可以调用WINDOWS API CreateThread。
3. MFC多线程编程,如何向辅助UI线程中添加控件消息响应函数
我不知道你说的辅助UI线程,姿毁是否是通过AfxBeginThread创建的CWinThread线程。关于消息响应手竖的问题,不知道你是否按照MFC的要求,建立了必要的类,重载了必要的函数。毕册大
但我更想说,你这种做法实在太复杂,完全可以在一个线程中完成的事情,何必放在两个线程里!!只要简单地在主窗口对话框中,创建一个定时器,就完全可以实现你需要的功能。
4. MFC中如何让多线程按先后顺序执行,第一个来的先执行,以后按先后到达的顺序执行
多线程处理这类问题可以用各种信号量或者锁解决,本质上原理都是很类似的,这里介绍一下事件信号薯搭册量,另外还有互斥量,就把CreateEvent换成CreateMutex就可以了。
先说一下WaitForSingleObject这个函数,如果参数1现在是有信号的,那么这个函数立刻返回WAIT_OBJECT_0,如果当前是无信号的,会卡死在这个函数上面,会一直等待,参数2指定最大等待时间,如果参数2不是INFINITE并且时间以到则返回超时,下面具体方法:
在恰当的位置定义:
HANDLE g_hWait;
g_hWait = CreateEvent( NULL , TRUE , TRUE , NULL );//创建一个初始为数宏有信号的事件量
线程枝埋函数
{
DWORD dWait = WaitForSingleObject( g_hWait , 3000 );//最多等待3秒,也可以是INFINITE无限等待
if( WAIT_OBJECT_0 != dWait )
{
//说明这是第一个线程或者前一个线程已经处理完成并且做了SetEvent( g_hWait );
ResetEvent( g_hWait );//转为无信号状态,其他线程在WaitForSingleObject会等待
开始干活
SetEvent( g_hWait );//转为有信号状态,其他线程的WaitForSingleObject会返回WAIT_OBJECT_0
}
}
5. mfc如何使用多线程搜索文件夹
1、根据API中的文件和目录操作函数构成一个具有递归功能的目录念弯键遍历和文件查找
2、可以根闹桥据MFC中对线程的封装格式,将上述操作放入仔巧线程函数中
3、更多交流参考我空间文章。
6. 求大神指导MFC多线程编程。进度条那种就行。我按照网上的例子运行出来
我用的BOOST库中的线程库滑胡
void CTestBoost::OnBnClickedBtntestboost()
{
// TODO: 在此添加控件通知处理程序代码
UINT length = 500;
m_wndProgress.SetRange(0, length);
m_wndProgress.SetStep(1);
m_wndProgress.SetPos(0);
boost::thread t(boost::bind(&CTestBoost::RunTest, this, length));
t.detach();//将子哗模线程和主线程分离,子线程执行完成后自己释放资源
}
void CTestBoost::RunTest(UINT length)
{
for(size_t i=0;i<length;i++)
{
m_wndProgress.SetPos(i);
Sleep(2);
}
MessageBox(_T("完成"),_T("乱让缓提示"),MB_ICONINFORMATION);
GetDlgItem(IDC_BTNTESTBOOST)->EnableWindow(TRUE);
runState=0;
}
7. MFC 多线程进度对话框
第一个问题,可以有两种方法:
1. 用全局变量来传递信息,在新线程中如果对话框被取消,给该全局变量赋一个值,在主线程传输文件过程中判断该变量的值,如果是取消了,则主线程取消文件传输。
2. 用自定义消息,在新线程中如果对话框被取消,就向主线程所在窗体发送消息,在主线程中创建一个处理该银中卖消息的函数实现相应的功能即可。
第锋逗二个问题,原因可能是这样的:在主线程中定义对话框dlg,在新线程中dlg.domodal,然后在主线程修改,但问题是要保证主线程和新线程严格按照设定的顺序来执行。在主线程中启动新线程之后,主线程仍然在执行,有可能新线程中dlg.domodal还没执行,主线程dlg.m_pro.setpos已经执行过了,所以会出问题,加入AfxMessageBox之后在弹出窗口没有关闭之前主线程没有继续往下执行,这就使新线程有足够的时间执行dlg.domodal,所以能够培燃执行成功。你可以在主线程建立对话框并启动新线程之后延时一段时间,再执行dlg.m_pro.setpos。
8. MFC中,怎样利用多线程和回调函数,从串口调试助手中接收数据,然后在编辑框中显示出来
你在你的串口类SerialPort里面加一个线程函数或者回调函数private函数:
static DWORD WINAPI ReceiveData(LPVOID lpParam); //线程函数
static WORD ProcessReceiveData(void* data);
void ProcessData(DWORD (*Func)(void*) ); //回调函数
然后再你接收数据的地方创建一个线程或者回调函数来处理你从串口接收到的数据:
CreateThread(NULL, 0, ReceiveData, this(或者你传入的参数) ,NULL, 0);//忘记了函数参数啊 或握枯者
ProcessData(ProcessReceiveData);
最后将该数据在编辑框中显示出来就可以了
(CEdit*)GetDlgItem(和伏ID_xxx)->段棚洞SetWindowsText("DATA");
只是提供一个思路
9. mfc创建线程的三种方法
MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务
1、WIN的API函数CreateThread
HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, // SD
DWORDdwStackSize, // initial stack size
LPTHREAD_START_ROUTINElpStartAddress, // thread function
LPVOIDlpParameter, // thread argument
DWORDdwCreationFlags, // creation option
LPDWORDlpThreadId // thread identifier
);
//lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED-----创建一个挂起的线程,
(2)0---------------------------------表示创建后立即激活。
lpThreadId:保存新线程的id。
2、MFC的全局函数AfxBeginThread
CWinThread* AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );
//用于创建工作者线程 其中pfnThreadProc指向线程函数 pParam为传递给线程函数的参数
CWinThread* AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );
//用于创建用户界面线程 其中pThreadClass为CWinThread派生对象的RUNTIME_CLASS
3、MFC的CWinThread类的CreateThreat成员函数
BOOL CreateThread( DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
//CWinThread类支持工作者线程和用户界面线程 可以将一个CWinThread派生类的CRUNTIMECLASS的指针作为参数传递给AfxBeginThread函数以创建一个用户界面线程 CWinThread类的CreateThread成员函数创建一个调用进程的地址空间中执行的线程
VC 6.0 创建线程的三种方法
CreateThread/ExitThread
_beginthreadex/_endthreadex
AfxBeginThread /AfxEndThread
对以上三种方式的选择:
1.在使用了MFC的程序中使用AfxBeginThread函数或者CWinThread::CreateThread函数创建线程。
2.在非MFC工程中,如果要创建多线程,建议使用_beginthreadex
3.避免使用CreateThread函数。不使用_beginthread.
4.线程内部退出函数使用与创建函数配套的函数。
10. 在多线程中如何调用MFC中类的一个函数
创建雹毕线程时将指针作为参数传入源樱芹
AfxBeginThread(SendThread, this, NULL);
在线程函数中再强转颂弯使用
UINT CMainFrame::SendThread(LPVOID pParam)
{
CMainFrame *pThis = (CMainFrame*)pParam;
...
pThis->m_progress.SetPos(ProgressCount);
...
return 1;
}