1.多一个线程就是多一个执行路线,你的问题并不复杂,想用UI还是Worker线程完全自便
2.在线程里操纵COM与在其他的地方有差别吗?没有.你既然想到了这个方案,也是很可行的呀.

解决方案 »

  1.   

    使用UI线程和Worker线程都可以,关键是注意线程和窗口的通信问题
    1) UI线程比WORKER线程要复杂一些
    2) 由于UI线程自动产生一个消息循环,所以可以象窗口一样按照消息驱动的思想工作;WORKER线程的工作方式更象DOS的程序,需要自己写一个大的LOOP
    3) 线程和窗口的通信方式建议采用消息更加自然
    4) xyzboat说的没错:"在线程里操纵COM与在其他的地方有差别吗?没有."
      

  2.   

    你们好谢谢!这个问题已经解决了,我把所有关于COM的操作代码全部移到了线程内部,就没有问题了,我这里用工作线程,因为我不需要传递消息给主线程,但是我把对话框的MS chart控件的指针传递给了线程,居然没有问题(是不是本来就应该没有问题?)。但是有一个新的问题:
    CoInit...();
    IRtdxExtPtr *p = new IRtdxExtPtr;
    some other operation....
    p.Release();
    if (p) delete p;        //这里出了错误
    ...
    CoUninit...();
      

  3.   

    不是拉,COM线程与其它地方有分别的,比如套间....
      

  4.   

    现在程序可以运行了,但是还是会出现非法操作,一般是在程序运行一段时间以后。指出的是MSCHRT20.OCX内部出错,我想我把MS CHART成员变量的指针作为参数传递给线程还是有问题的。
    我的代码如下:
    UINT RSReDrawThreadProc(LPVOID lpParam)
    { RS_REDRAW_INFO  *lpRSRedrawThreadInfo = (RS_REDRAW_INFO *)lpParam;
    short int samples[SAMPLE_SIZE];
    char tmpStr[20];
    while(1)
    {//redraw transmitted signal chart
    m_eRSRedraw.ResetEvent();
    WaitForSingleObject(m_eReceive,INFINITE);//received compelety
    for(int i=0;i<(SAMPLE_SIZE);i++)
    {
    samples[i] = *(lpRSRedrawThreadInfo->m_pSamples+i);
    }
    m_eRSRedraw.SetEvent();//release TSRedraw handle
    for(i=0;i<SAMPLE_SIZE;i++)
    {
      _itoa(samples[i],tmpStr,10);
    lpRSRedrawThreadInfo->m_pChart->SetRow(i+1);
    lpRSRedrawThreadInfo->m_pChart->SetData(tmpStr);
    }
    if(m_bExitAllThread)
    break;
    }
    AfxEndThread(0);
    return 0;
    }
    能找出是什么原因吗?
      

  5.   

    你写的是不是COM啊,怎么还有new一个接口的?release了接口还要delete它。amanne,我想你得补课了。
      

  6.   

    我看你写的不是COM。因为COM不会去new一个接口的,而且release了接口还要delete它,这不是和它过不去吗!应该是new COM对象,release COM接口,delete COM对象。你可以不用ATL写COM,但那样你会有一堆麻烦事:做Class Factory,实现IUnknown等等等等,我看你都没做吧。另外,在COM中有apartment概念,与线程有关。你要顺利地完成这个项目,有一堆东西要学了。
      

  7.   

    是啊是啊,我这方面薄弱得很啊,现在我只是想简单化,作为一个COM客户对COM服务器调用。不想自己去实现一大堆东西。
    怎么做比较好?