用两个线程在Form的Canvas上绘图,拖动窗口时出现异常?(急急急)(100分)

无常

Unregistered / Unconfirmed
GUEST, unregistred user!
我另外创建了一个线程通过以太网接收数据(速率很高,ms量级),每收到一定数据后在主窗体Canvas上绘制曲线显示。如果不移动窗体,程序运行正常;如果移动窗体,有时会出现异常,提示Canvas can't drawing.是不是移动时主窗体在重绘,而我创建的线程也在绘图?
 
Z

zywcd

Unregistered / Unconfirmed
GUEST, unregistred user!
你试试使用chart绘图,
看看chart是不是可以自己处理。
 

无常

Unregistered / Unconfirmed
GUEST, unregistred user!
chart怎么用?我要在屏幕上绘的图就是将一些离散的点连起来形成一个正弦曲线
 
Z

zywcd

Unregistered / Unconfirmed
GUEST, unregistred user!
我明白你的意思。如果显示曲线,我觉得使用teechart是最好了。
series1.addxy(x,y);就可以简单进行绘制,而且十分方便。
如果你是数组,可以直接实现。
series1.addarray()
 
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
线程没同步。
 

无常

Unregistered / Unconfirmed
GUEST, unregistred user!
线程如何同步?主窗体是自动重绘的,怎么互斥啊?
 

无常

Unregistered / Unconfirmed
GUEST, unregistred user!
忘说了,我是用BCB做的
 
G

godelphi2004

Unregistered / Unconfirmed
GUEST, unregistred user!
提醒楼主一句,VCL本身就不是线程安全的,解决这样的问题,要么使用Synchronize方法,要么发消息让主线程自己处理
 
B

bmsr

Unregistered / Unconfirmed
GUEST, unregistred user!
统一楼上的,这种情况,线程应该只计算和提供数据给你要绘图得窗体,窗体上用一个循环或时钟(建议用时钟)访问各线程提供得数据,然后根据数据窗体对自己进行绘画,同时对处理玩的数据做已处理得标记或干脆释放掉处理完得数据。注意,线程最好只作添加数据,而不是更改,防治数据冲突。
 

无常

Unregistered / Unconfirmed
GUEST, unregistred user!
我用了消息解决了这个问题,当接收线程收到数据后,发送消息给主线程。
char arr[100];
SendMessage(Form1->Handle, WM_MSG_DRAW_REAL, (WPARAM)arr, 0);
消息处理函数是
void __fastcall TForm1::show_average_value(int lpar);
本来是想将数据缓冲区的地址发送过去的,为什么消息函数中lpar得到的不是这个地址
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部