还是关于线程的问题(关于线程的问题总是很多啊!呵呵!)--请进

酷点点 2001-03-09 09:46:00
问题:我的程序就是一基于对话框的单一界面,其中加入了二个MS_CHART ActiveX控件用于数据的输出。一个用于模拟sin waveform输入显示,一个用于对其调制后的波形输出显示,其中我的程序作为一信号处理COM(专门用于信号处理的COM服务器)的client(容器)。现在我想用四个线程来做,二个线程做显示,二个线程做信号传输(对COM操作)。请问,可以直接用WIN32 API的线程来做吗?如果用MFC的线程来做是用UI线程还是用工作线程?
提示:线程必须对MS-CHART控件进行操作,它们被定义为对话框的成员变量。线程里有对COM服务器的处理。

各位能不能提出一个比较可行的方案?有没有在线程中对COM服务器操作的经验?
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
酷点点 2001-04-26
  • 打赏
  • 举报
回复
给分给分,呵呵!
总是可以解决问题的。
luxyi 2001-03-14
  • 打赏
  • 举报
回复
不是我不愿意告诉你,主要是因为我现在思路还没有理清楚,另外我也比较懒,像这种不是三言两语就能说完的实现的问题我懒得回答。我比较喜欢讨论概念性、原理性的问题。对不起。
酷点点 2001-03-13
  • 打赏
  • 举报
回复
是啊是啊,我这方面薄弱得很啊,现在我只是想简单化,作为一个COM客户对COM服务器调用。不想自己去实现一大堆东西。
怎么做比较好?
luxyi 2001-03-13
  • 打赏
  • 举报
回复
我看你写的不是COM。因为COM不会去new一个接口的,而且release了接口还要delete它,这不是和它过不去吗!应该是new COM对象,release COM接口,delete COM对象。你可以不用ATL写COM,但那样你会有一堆麻烦事:做Class Factory,实现IUnknown等等等等,我看你都没做吧。另外,在COM中有apartment概念,与线程有关。你要顺利地完成这个项目,有一堆东西要学了。
luxyi 2001-03-13
  • 打赏
  • 举报
回复
你写的是不是COM啊,怎么还有new一个接口的?release了接口还要delete它。amanne,我想你得补课了。
酷点点 2001-03-13
  • 打赏
  • 举报
回复
现在程序可以运行了,但是还是会出现非法操作,一般是在程序运行一段时间以后。指出的是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;
}
能找出是什么原因吗?
Kontery 2001-03-11
  • 打赏
  • 举报
回复
不是拉,COM线程与其它地方有分别的,比如套间....
酷点点 2001-03-11
  • 打赏
  • 举报
回复
你们好谢谢!这个问题已经解决了,我把所有关于COM的操作代码全部移到了线程内部,就没有问题了,我这里用工作线程,因为我不需要传递消息给主线程,但是我把对话框的MS chart控件的指针传递给了线程,居然没有问题(是不是本来就应该没有问题?)。但是有一个新的问题:
CoInit...();
IRtdxExtPtr *p = new IRtdxExtPtr;
some other operation....
p.Release();
if (p) delete p; //这里出了错误
...
CoUninit...();
ecai 2001-03-09
  • 打赏
  • 举报
回复
使用UI线程和Worker线程都可以,关键是注意线程和窗口的通信问题
1) UI线程比WORKER线程要复杂一些
2) 由于UI线程自动产生一个消息循环,所以可以象窗口一样按照消息驱动的思想工作;WORKER线程的工作方式更象DOS的程序,需要自己写一个大的LOOP
3) 线程和窗口的通信方式建议采用消息更加自然
4) xyzboat说的没错:"在线程里操纵COM与在其他的地方有差别吗?没有."
xyzboat 2001-03-09
  • 打赏
  • 举报
回复
1.多一个线程就是多一个执行路线,你的问题并不复杂,想用UI还是Worker线程完全自便
2.在线程里操纵COM与在其他的地方有差别吗?没有.

你既然想到了这个方案,也是很可行的呀.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧