求助!!
我目前做程序遇到一些关于多线程的问题。
我首先在主线程A中创建一个线程B。
然后B线程中执行一些功能,有一个自己的消息循环。
这个时候我用PostThreadMessage关闭线程B,但是线程B的一些资源就无法关闭(B是ActiveX,打开的WINWORD.EXE 无法自动退出)我该怎么样关闭线程B中打开的WINWORD.EXE(通过微软自带的任务管理器发现的)。我主要用的是ActiveX。
我是直接在网上下载一个sample,然后自己修改的。那个sample可以正常退出的。

解决方案 »

  1.   

    调用方法使用CreateProcess,获得句柄,然后发送关闭消息,或者findwindows,SendMessage应该也可以
      

  2.   

    A: PostThreadmessage(B, WM_QUIT)
    B:while (getMessage(msg))
    {
      if (msg == WM_QUIT) then
        break;
    }不明白什么资源不释放??线程退不出去一般就是死循环,阻塞,如果有进程死了,就用TerminateProcess干掉它
      

  3.   

    这是我的B线程
    DWORD WINAPI tmpf (LPVOID lpParameter)
    {
        ...................
        pFR->MessageLoop(); 
        return TRUE;
    }
    A的退出是这样的
    PostThreadMessage(tempword,WM_CLOSE, 0,0);
    PostThreadMessage(tempword,WM_QUIT, 0,0);
    CloseHandle(hThreadWnd);//这里是关闭线程的HWND
      

  4.   

    调用方法使用CreateProcess,获得句柄,然后发送关闭消息,或者findwindows,SendMessage应该也可以
    -----------------------------------------------------------------------------------
    为什么是CreateProcess呢?
    还有我的线程是安全关闭了,是线程开的WINWORD.EXE无法关闭
      

  5.   

    刚才我看了看,似乎我的消息有问题。我在A中发送的消息
    PostThreadMessage(tempword,WM_CLOSE, 0,0);
    PostThreadMessage(tempword,WM_QUIT, 0,0);并没有在B中交给pFR->MessageLoop(); 而是B自己处理了。我该如何设置才可以使B收到消息不自己处理而是交给pFR->MessageLoop(); 谢谢!!!
      

  6.   

    你是用COM的方法创建的WINWORD实例? 如果那样的话,不会主动退出.因为现在的WORD是一个COM服务器.你可以用CreateProcess直接创建WORD进程,然后再调用其中的COM接口.这样,结束线程的时候就把这个WORD 进程杀死. KILL之前要反初始化COM
      

  7.   

    下面是我CreateObject的方法BOOL CFrame::CreateObject(LPTSTR pszFile)
        {    
        m_pSite=new CSite(++m_dwIDCounter, m_hWndClient, this);    if (NULL==m_pSite)
            return FALSE;    m_pSite->AddRef();  //So we can free with Release    /*
         * Now tell the site to create an object in it using the filename
         * and the storage we opened.  The site will create a sub-storage
         * for the doc object's use.
         */
        if (!m_pSite->Create(pszFile, m_pIStorage))
            return FALSE;    m_fHaveObject=TRUE;    //We created the thing, now activate it with "Show"
        m_pSite->Activate(OLEIVERB_SHOW); //Force repaint to show "have object" message
    InvalidateRect(m_hWndClient, NULL, TRUE);
    UpdateWindow(m_hWndClient);
        return TRUE;        
        }
      

  8.   

    PostThreadMessage(tempword,WM_QUIT, 0,0);返回成功了么?
    while ( !PostThreadMessage(tempword,WM_QUIT, 0,0); ) Sleep(5);试试。
      

  9.   

    PostThreadMessage(tempword,WM_QUIT, 0,0);返回成功了么?
    -------------------------------------------------------
    我这样发送后似乎就直接把B线程结束了。而我的本意是把这个消息传送给B线程中的消息循环
    pFR->MessageLoop();
    然后我自己处理这些消息。
      

  10.   

    我这样发送后似乎就直接把B线程结束了。而我的本意是把这个消息传送给B线程中的消息循环
    pFR->MessageLoop();
    然后我自己处理这些消息。
    -----------------------------------
    1 你b线程有地方阻塞了
    2 你有其他的循环截获了这个消息,
    3 想不出来了应该不会直接结束的,你再仔细看看吧.
      

  11.   

    我的线程B很简单的,就是
    DWORD WINAPI tmpf (LPVOID lpParameter)
    {
    PCFrame pFR;
    HWND hParent;
    struct _ActiveFile_Param *ParamList = (struct _ActiveFile_Param *)lpParameter;
    if(!lpParameter)
       return FALSE;
    pFR=ParamList->p;
    hParent=GetHwndFromWidgetBank(ParamList->widget->parent);
    pFR->Init((UINT)hParent,ParamList->x,ParamList->y,ParamList->width,ParamList->height);
    printf("\nopen file......\n");
    pFR->CreateObject((LPTSTR)(ParamList->filename));
    SetEvent((*(TsActiveX *)((ParamList->widget)->data_struct)).hEvent);
    pFR->MessageLoop(); 
    printf("\nclose file......\n");
    return TRUE;
    }
      

  12.   

    PostThreadMessage(tempword,IDM_FILECLOSE, 0,0);
    PostThreadMessage(tempword,WM_QUIT, 0,0);我在A中是用上面两条调用的。
    结果发现
    printf("\nopen file......\n");

    printf("\nclose file......\n");
    都可以显示的。我估计问题在于B线程接受到消息WM_QUIT,然后就自己退出了。而我希望它可以把消息交给pFR->MessageLoop(); 由这个MessageLoop去处理
      

  13.   

    我刚才尝试了下,如果没有pFR->MessageLoop();
    直接在
    pFR->CreateObject((LPTSTR)(ParamList->filename));
    SetEvent((*(TsActiveX *)((ParamList->widget)->data_struct)).hEvent);
    后面写
    pFR->Close();
    Sleep(10000);
    会发现WINWORD.EXE在任务管理器里面出来一会儿,然后就会消失。看来的确是和MessageLoop有关