一个关于线程数据的问题

fendou709 2007-12-10 10:28:38
为了计算一个数组的行数在一个线程中单独进行计算,将VIEw类指针作为参数传了进去,目的是将计算结果赋给View类的一个成员函数,在线程中可以得到正确结果,但是在外面获取时总是为0,不知道为什么啊?请高手指教!
...全文
121 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdzwj 2007-12-12
  • 打赏
  • 举报
回复
看代码应该是线程同步的问题
captain_x 2007-12-12
  • 打赏
  • 举报
回复
我已经说过了,就是这样的
fendou709 2007-12-12
  • 打赏
  • 举报
回复
呵呵谢谢大家的指教,请看以下我的部分代码:
...
//线程函数
UINT TranslateAllBufferToArray(LPVOID param)
{
CAhEditView *now_param = (CAhEditView*)param;
....
now_param->m_ToalRowNumFromBuff = dwTotal;//这里可以得到需要的数据
}
//类的成员函数,调用线程函数,取出计算的结果
void CAhEditView::OpenFileByName(LPCTSTR FileName)
{
.....
CAhEditView* cmyself;
cmyself = this;
//启动一个新线程执行数据分析
//这里出现了线程之间的同步问题,如何准确获得由线程得到的数据
AfxBeginThread(TranslateAllBufferToArray,cmyself);
//m_ToalRowNumFromBuff是CAhEditView的成员变量
TRACE("m_ToalRowNumFromBuff is :%d\n",m_ToalRowNumFromBuff);//这时得到的却是0,错误啊!
}

captain_x 2007-12-11
  • 打赏
  • 举报
回复
to:dronly
不要感觉,你自己可以做一下试验,如果成功了你再来说。
简单的可以用个对话框,然后再开个线程,把这个对话框类传过去,然后调用其函数。
这个我们做过试验,然后查资料,得出的就是上面的结论。
jameshooo 2007-12-11
  • 打赏
  • 举报
回复
大多数关于窗口的API都不是线程安全的,在多线程环境中,适宜使用SendMessage、PostMessage来跟窗口通信,尽量不要直接调用其它的窗口API。
captain_x 2007-12-11
  • 打赏
  • 举报
回复
呵呵,我说的是mfc,你拿vcl当例子有什么用?
你可以按照我说的实验一下看看。
dronly 2007-12-11
  • 打赏
  • 举报
回复
感觉这个跟线程安全应该没什么关系啊

1.注意你传进去的View类是否已经是一个存在的空间而不仅仅是一个指针,就是有没有new 出来

2.注意你的View 类有没初始化过

3.你的View 类销毁的时间

4.你传进去的是否实参数,行参的话传多少次都不会在运行后得到结果

5.还有就是要确定是你的线程先运行完还是你的外部获取返回值的程序运行完了,windows用的是抢占式多线程,主线程还是工作线程先运行完是不固定的.
dronly 2007-12-11
  • 打赏
  • 举报
回复
to captain_x:
这里说感觉是我不对
我曾经做个一个这样功能的DLL
接口涵数是int InitTreeView(TTreeView* tree) //就是初始话一个TreeView控件 当时用的是C++Builder
功能是通过接受到的TTreeView指针,然后读取数据库的某个表,按分类的构造TreeView的内容,同时返回TreeView的
节点总数判断涵数是否执行成功,>0是成功,=0是条件错误,<0是异常错误.

DLL接受到 TTreeView *tree 后自动的构造 TThread 类,并用Event 锁起来
Thread 类先构造 TADOQuery 类运行SQL语句访问数据库并读取数据.
然后开始构造 TTreeNode 结构的数据并放到TTreeView *tree 上,
基本上用的是TTreeView *tree 自己的add()涵数,
线程结束前启动Event
DLL返回后释放自己.
测试的 TForm1 一切正常.

VC 下我很少做这个,因为VC下写自动创建界面类的时候因为VC本身的界面管理零散,一般自己做了一个界面资源管理器,
实际上就是一个头指针是Global的指针树

补充一下,楼主的问题里面线程里面传给TView的值是否临时变量或线程类本身的变量,如果是的话生存期就只到线程结束之前
fendou709 2007-12-10
  • 打赏
  • 举报
回复
哦?进程间通信 ?感觉就是 很简单的一个使用啊,还这么麻烦 呵呵
captain_x 2007-12-10
  • 打赏
  • 举报
回复
mfc的view不是线程安全的,不能跨线程使用,原因是使用了tls存储数据
解决办法就是用进程间通信办法

15,473

社区成员

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

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