在一个基于对话框的程序中,创建了一个新的线程,在该线程中调用主对话框类中的成员函数,是否会引起阻塞啊?

解决方案 »

  1.   

    对的,我还是把我程序贴出来,大家帮忙分析下吧;
    在点击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在主对话框线程中是不断刷新的。
      

  2.   

    没有死锁或阻塞的情况出现,只是有人看了这个程序,提出了说这样还是调用了主线程,可能会出现死锁或阻塞,主线程与新线程都用了infrared_buff、visible_buff这两个全局变量,会不会使得程序存在什么隐患呢
      

  3.   

    我觉得也该加个锁。
    我常常这样做:
    多个线程处理,然后调用对话框的函数往对话框listctrl控件写日志。写太快的时候界面要假死
      

  4.   


    函数不属于某个线程,你在你的线程里调用了CMyDvrClientDlg里的函数,那么这个函数就在你这个线程执行了,与主线程无关多线程操作同一个变量肯定有安全问题,加个锁就行
      

  5.   

    死锁的前提: 线程互相等待;
    对有界面的线程, 他的线程在循环执行GetMessage操作;
    如果子线程中,也有对窗口,包括子控件的函数调用, 就可能会转到主线程处理后再返回该线程;
    如子线程调用 SetWindowsText(Hwnd, ..), 
    系统会调用SendMessage函数, 操作系统会检查这个窗口是否这个线程所有, 如不是, 则向窗口关联线程发送一个WINDOWS MESSAGE, 并且等待那个线程处理(真正执行还是在关联线程), 这实际上有个线程同步的过程, 只不过这个过程是由系统自己实现的, 不需要用户关心.