无 无常 Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #1 我另外创建了一个线程通过以太网接收数据(速率很高,ms量级),每收到一定数据后在主窗体Canvas上绘制曲线显示。如果不移动窗体,程序运行正常;如果移动窗体,有时会出现异常,提示Canvas can't drawing.是不是移动时主窗体在重绘,而我创建的线程也在绘图?
我另外创建了一个线程通过以太网接收数据(速率很高,ms量级),每收到一定数据后在主窗体Canvas上绘制曲线显示。如果不移动窗体,程序运行正常;如果移动窗体,有时会出现异常,提示Canvas can't drawing.是不是移动时主窗体在重绘,而我创建的线程也在绘图?
Z zywcd Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #2 你试试使用chart绘图, 看看chart是不是可以自己处理。
无 无常 Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #3 chart怎么用?我要在屏幕上绘的图就是将一些离散的点连起来形成一个正弦曲线
Z zywcd Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #4 我明白你的意思。如果显示曲线,我觉得使用teechart是最好了。 series1.addxy(x,y);就可以简单进行绘制,而且十分方便。 如果你是数组,可以直接实现。 series1.addarray()
我明白你的意思。如果显示曲线,我觉得使用teechart是最好了。 series1.addxy(x,y);就可以简单进行绘制,而且十分方便。 如果你是数组,可以直接实现。 series1.addarray()
G godelphi2004 Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #8 提醒楼主一句,VCL本身就不是线程安全的,解决这样的问题,要么使用Synchronize方法,要么发消息让主线程自己处理
B bmsr Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-17 #9 统一楼上的,这种情况,线程应该只计算和提供数据给你要绘图得窗体,窗体上用一个循环或时钟(建议用时钟)访问各线程提供得数据,然后根据数据窗体对自己进行绘画,同时对处理玩的数据做已处理得标记或干脆释放掉处理完得数据。注意,线程最好只作添加数据,而不是更改,防治数据冲突。
统一楼上的,这种情况,线程应该只计算和提供数据给你要绘图得窗体,窗体上用一个循环或时钟(建议用时钟)访问各线程提供得数据,然后根据数据窗体对自己进行绘画,同时对处理玩的数据做已处理得标记或干脆释放掉处理完得数据。注意,线程最好只作添加数据,而不是更改,防治数据冲突。
无 无常 Unregistered / Unconfirmed GUEST, unregistred user! 2006-09-22 #11 我用了消息解决了这个问题,当接收线程收到数据后,发送消息给主线程。 char arr[100]; SendMessage(Form1->Handle, WM_MSG_DRAW_REAL, (WPARAM)arr, 0); 消息处理函数是 void __fastcall TForm1::show_average_value(int lpar); 本来是想将数据缓冲区的地址发送过去的,为什么消息函数中lpar得到的不是这个地址
我用了消息解决了这个问题,当接收线程收到数据后,发送消息给主线程。 char arr[100]; SendMessage(Form1->Handle, WM_MSG_DRAW_REAL, (WPARAM)arr, 0); 消息处理函数是 void __fastcall TForm1::show_average_value(int lpar); 本来是想将数据缓冲区的地址发送过去的,为什么消息函数中lpar得到的不是这个地址