opc问题还是线程问题?

vahaha2 2017-09-01 02:58:30
有一个opc的类,从opc服务器读写数据。
主窗体下开了一个线程,设置了opc类的变量(intopc1)为静态全局变量,

问题如下:
1、线程里有判断语句 if(1==intopc1),用outputdebugstring来监控intopc1这个变量的值的时候,值是1,类型是int,但这个判断语句就是一直不成立!
2、在主窗体的界面上有个按钮,用来写opc服务器里的整形变量的,能写成功;在线程里调用该按钮函数来执行写整形操作,却不成功,用outputdebugstring来监控,两种方式写的值是一样的,类型也是一样的,但主窗体下就成功,线程下就不成功,很不明白。
求大神们指点指点
...全文
701 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧童吃五谷 2017-09-07
  • 打赏
  • 举报
回复
额外再说一句主线程一般不能用自由线程模型,否则操作系统的很多东西都不能用了,例如文件打开对话框都不能用了!呵呵
牧童吃五谷 2017-09-07
  • 打赏
  • 举报
回复
"主窗体下就成功,线程下就不成功,很不明白" 应该是因为你的线程也需要初始化COM线程模型的,同时COM接口指针一般最好不要在多个线程之间共享,除非你确认使用COM接口指针的两个线程都是采用自由线程模型,两个线程都需要调用下面的函数 ::CoInitializeEx(0, COINIT_MULTITHREADED); ::CoUninitialize();
schlafenhamster 2017-09-06
  • 打赏
  • 举报
回复
主窗口是个线程,2个 线程 就有 同步问题, 再说 DC 是 不能 跨进程的。
vahaha2 2017-09-06
  • 打赏
  • 举报
回复
如果线程里调用主窗体的函数比较简单,比如显示数字或者MessaageBox一些文字,那是正常的,但涉及到数据流动,好像就不一定行了。常规没错,但原因是什么?
schlafenhamster 2017-09-05
  • 打赏
  • 举报
回复
"改为在线程用postmessage来执行按钮函数,但原来通过传窗体参数来调用窗体的按钮的做法还是不成功," 线程中不进行界面的 操作是 常规。
vahaha2 2017-09-05
  • 打赏
  • 举报
回复
问题1解决了:原因是其实intopc1是一个变量,没对应上 问题2也算解决了:改为在线程用postmessage来执行按钮函数,但原来通过传窗体参数来调用窗体的按钮的做法还是不成功,还是希望得到大神们的解惑。
vahaha2 2017-09-04
  • 打赏
  • 举报
回复
应该 mopc.WriteLng(lngWrite[0],intIndex[0]); ? 不能这样的,而且编译都不通过。 我想这应该是线程的问题,线程里操作主窗体的问题。 我打算用postmessage来试试
vahaha2 2017-09-03
  • 打赏
  • 举报
回复
void CmainDlg::subWriteLong(long lngWrite[],int intIndex[]) { if (m_isConnOPC) { mopc.WriteLng(lngWrite,intIndex); } }
schlafenhamster 2017-09-03
  • 打赏
  • 举报
回复
应该 mopc.WriteLng(lngWrite[0],intIndex[0]); ?
vahaha2 2017-09-02
  • 打赏
  • 举报
回复
void CmainDlg::OnBnWriteInt() { // TODO: 在此添加控件通知处理程序代码 int intIndex[1]; long lngWrite[1]; intIndex[0]=368; //opc的某个 整形变量 lngWrite[0]=2; subWriteLong(lngWrite,intIndex); //===================eng=================== }
schlafenhamster 2017-09-02
  • 打赏
  • 举报
回复
subWriteLong(lngWrite,intIndex); ?
schlafenhamster 2017-09-02
  • 打赏
  • 举报
回复
subWriteLong 定义?
vahaha2 2017-09-02
  • 打赏
  • 举报
回复
是的,还调用一个函数,不过此时是一样的了,值一样,类型一样,再传给另外的函数,结果是一样的。
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
看看你的 OnBnWriteInt() !
vahaha2 2017-09-01
  • 打赏
  • 举报
回复
按钮没关联变量
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
只是写的内容和变量类型, 按钮 是一个 关联变量 ?改控件。
vahaha2 2017-09-01
  • 打赏
  • 举报
回复
其实有两个这样的按钮函数,在线程里都不行,在主窗体都行
zgl7903 2017-09-01
  • 打赏
  • 举报
回复
怀疑是有越界操作 重新清理和编译项目, 程序入口处设置断点, 在确认intopc1等于1后,设置&intopc1 数据断点, 调试运行看看, 如果被改写的话,IDE会弹出提示,并停在代码处,结合调用堆栈修改代码
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
最好是 Send 一个 自定义 消息。(与界面 分开)
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
重新写 一个函数 试试 pDlg->BnWriteInt();
加载更多回复(7)

15,471

社区成员

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

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