新线程中调用主对话框中的类成员函数是否会发生阻塞? 在一个基于对话框的程序中,创建了一个新的线程,在该线程中调用主对话框类中的成员函数,是否会引起阻塞啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对的,我还是把我程序贴出来,大家帮忙分析下吧;在点击OnTransfer的button后,创建线程: m_bAlive=TRUE; //这个是后传线程开始的标志,是主对话框的类成员变量 // 创建后传线程 if (!m_hInputThread) { m_hInputThread = CreateThread(0, 200, InputProc, this, 0, NULL); //CloseHandle(m_hInputThread); }线程入口函数:// 后传线程函数DWORD WINAPI InputProc(void *lpvoid);DWORD WINAPI InputProc(void *lpvoid){ CMyDvrClientDlg *pdlg = (CMyDvrClientDlg *)lpvoid; pdlg->InputThread(); return 0;}主对话框的类成员函数InputThread():void CMyDvrClientDlg::InputThread(){ while(m_bAlive) { for (int i=0;i<4;i++) { if ((m_bOpen[i])&&(i==3)) { HB15_InputData(i, infrared_buff, WIDTH, HEIGHT, CSP_YUV422_YUYV);//红外 //Sleep(3); } if ((m_bOpen[i])&&(i==1)) { HB15_InputData(i, visible_buff, VISWIDTH, VISHEIGHT, CSP_YUV422_YUYV);//可见光 //Sleep(3); } } }}其中,infrared_buff、visible_buff在主对话框线程中是不断刷新的。 没有死锁或阻塞的情况出现,只是有人看了这个程序,提出了说这样还是调用了主线程,可能会出现死锁或阻塞,主线程与新线程都用了infrared_buff、visible_buff这两个全局变量,会不会使得程序存在什么隐患呢 我觉得也该加个锁。我常常这样做:多个线程处理,然后调用对话框的函数往对话框listctrl控件写日志。写太快的时候界面要假死 函数不属于某个线程,你在你的线程里调用了CMyDvrClientDlg里的函数,那么这个函数就在你这个线程执行了,与主线程无关多线程操作同一个变量肯定有安全问题,加个锁就行 死锁的前提: 线程互相等待;对有界面的线程, 他的线程在循环执行GetMessage操作;如果子线程中,也有对窗口,包括子控件的函数调用, 就可能会转到主线程处理后再返回该线程;如子线程调用 SetWindowsText(Hwnd, ..), 系统会调用SendMessage函数, 操作系统会检查这个窗口是否这个线程所有, 如不是, 则向窗口关联线程发送一个WINDOWS MESSAGE, 并且等待那个线程处理(真正执行还是在关联线程), 这实际上有个线程同步的过程, 只不过这个过程是由系统自己实现的, 不需要用户关心. 如何开发Windows标准控件--非ActiveX windows如何配置SVN服务器及客户端? VC图像处理编译优化+代码优化>>SSE2? 求助 ie自动完成 帮帮忙,替别人求一道题。我C不是很懂 传递hdc 计算机同行们给点建议!! OpenGL 双窗口问题。 怎样实现windows的开始菜单那样的菜单? opencv在vc2003.net下怎么用? 两个线程问题 如何在一个ATL窗口里添加一个ActiveX控件?
在点击OnTransfer的button后,创建线程:
m_bAlive=TRUE; //这个是后传线程开始的标志,是主对话框的类成员变量
// 创建后传线程
if (!m_hInputThread)
{
m_hInputThread = CreateThread(0, 200, InputProc, this, 0, NULL);
//CloseHandle(m_hInputThread);
}线程入口函数:
// 后传线程函数
DWORD WINAPI InputProc(void *lpvoid);
DWORD WINAPI InputProc(void *lpvoid)
{
CMyDvrClientDlg *pdlg = (CMyDvrClientDlg *)lpvoid;
pdlg->InputThread();
return 0;
}主对话框的类成员函数InputThread():
void CMyDvrClientDlg::InputThread()
{
while(m_bAlive)
{
for (int i=0;i<4;i++)
{
if ((m_bOpen[i])&&(i==3))
{
HB15_InputData(i, infrared_buff, WIDTH, HEIGHT, CSP_YUV422_YUYV);//红外
//Sleep(3);
}
if ((m_bOpen[i])&&(i==1))
{
HB15_InputData(i, visible_buff, VISWIDTH, VISHEIGHT, CSP_YUV422_YUYV);//可见光
//Sleep(3);
}
}
}
}
其中,infrared_buff、visible_buff在主对话框线程中是不断刷新的。
我常常这样做:
多个线程处理,然后调用对话框的函数往对话框listctrl控件写日志。写太快的时候界面要假死
函数不属于某个线程,你在你的线程里调用了CMyDvrClientDlg里的函数,那么这个函数就在你这个线程执行了,与主线程无关多线程操作同一个变量肯定有安全问题,加个锁就行
对有界面的线程, 他的线程在循环执行GetMessage操作;
如果子线程中,也有对窗口,包括子控件的函数调用, 就可能会转到主线程处理后再返回该线程;
如子线程调用 SetWindowsText(Hwnd, ..),
系统会调用SendMessage函数, 操作系统会检查这个窗口是否这个线程所有, 如不是, 则向窗口关联线程发送一个WINDOWS MESSAGE, 并且等待那个线程处理(真正执行还是在关联线程), 这实际上有个线程同步的过程, 只不过这个过程是由系统自己实现的, 不需要用户关心.