vc dll 时间片 刷新 线程

来源:百度知道 编辑:UC知道 时间:2024/05/14 04:41:16
dll里有这么两个函数,是这样的:
函数Func1:执行的时候,会触发一个OnDataChange事件。该事件将得到一个数值(int类型),并赋给全局变量(int i;)。
函数Func2:该函数的返回值是int类型,返回的值就是OnDataChange得到的值,所以我想将全局变量(i)给返回去。

外部调用以上两个函数:
先调用Func1,然后马上就调Func2。

问题出现在:
外部调用Func1之后,然后调用Func2时,OnDataChange事件还没有得到值呢,所以全局变量也就没有被赋值,所以函数Func2返回的就是一个错误值。
但是我要是在函数Func2里添加一个AfxMessageBox("ddd"),这样就没有问题了。
外部调用Func1之后,然后调用Func2时,会弹出一个ddd对话框,我点确定后,就可以得到OnDataChange事件得到的值了(也就是全局变量int,已经被赋值了)。

我觉的,是不是因为函数Func1和Func2是在同一个线程里,由于抢占时间片,所以造成了Func2取不到值的结果啊?加上AfxMessageBox以后,执行到函数Func2时,弹出对话框,时间片被OnDataChange枪走,所以取值正确啊?

这个问题该如何解决呢?要不再启用一个线程?
朋友,你明白我说的意思吗,我自己都有些迷糊了!
1楼:我用Sleep()了,结果不行。感觉Func2被Sleep()了,整个Dll也都被Sleep了,因为他们是在一个线程中。
2,3楼:SendMessage我没用过,我查查资料先,谢谢你们了。

OnDataChange事件里面也没有post啊?SendMessage用到哪里啊,是OnDataChange里,还是Func2里?
OnDataChange事件是读取OPC Server的回调函数的数据。
这样能解决问题吗?

3楼:我Sleep(80),还是不行啊。第一次执行Func2取到的是空值,(是0)。第二次执行Func2,才取到正确的值。
我快疯了!谢谢你们了!帮帮我吧

这是线程之间的不同步问题。

你加了一个AfxMessageBox,也就是等于加了一段等待时间,在等待的过程中,系统处理了OnDataChange的消息,并运行了OnDataChange()函数。

方法1:你发触发OnDataChange事件的消息时用了post, 你应该用SendMessage.

方法2:你还可以加MessageBox 那里加一个Sleep(30), 但这不是好做法。

方法3:如果遇到了类似的问题还可以用CMutex来控制对某个变量的访问,你学了多线程编程就懂了。

你就用方法2,Sleep(30)或者Sleep(50),最多不能超过100, 其他的很难跟你说清楚,去找本讲win32 API编程的书看看。

你把代码发过来,我帮你该。Fixend@163.com

我是提问题的那个人。再问个问题:和上面的问题有些联系。

CArray<double, double> m_Data10Array;
int idata; //初始化为0

然后在一个OnDataChenge事件里将得到的值添加到该集合类中,(假设该函数调用500次)
//csData是 CString 类型
m_Data10Array.Add(atof((LPCTSTR)csData));

该函数调用完以后,我调用Func函数来读集合类中的数据,(该函数也将被调用500次)
int Func(double* pvalue)
{
int i;
CString str;
i = m_Data10Array.GetSize();
str.Format("集合类中共有%d条记录,现在查找第%d条", i, idata);
AfxMessageBox(str);
*pvalue = m_Data10Array.GetAt(idata);
idata++;
return 1;
}