在多线程中提示这样的错误。请高手解决。谢了。"在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级(50分)

  • 主题发起人 主题发起人 hzjone
  • 开始时间 开始时间
是VB。NET但机制差不多。C#解决也给分。
 
沒有有使用 Synchronize 同步嗎?
 
不能在线程里创建控件的吧!
 
樓主的做法很不安全...
 
to kouchun.教我一下。我线程没做过。最近因为数据量查询太大。没有办法做成多线程。不知道怎么样。创建可视控件后设PARENT后会出错。帮我一下,分数可再加。
 
不要在線程上創造控件不就行了嗎??
 
但是在主线程上(即初始化的窗体,对吗?)的有一个DATAGRID。数据集必须通过它来显示。我在第二个线程中得到数据集通过事件传到主线程上。结果出错了。有没有办法调用主线程的DATAGRID来给第二个线程的数据集用啊。我把DATAGRID去掉一切正常。谢谢。
 
当线程需要使用主线程序的可视控件,怎么办? 请在线程函数里使用Synchronize来同步,一切OK,你这问题是典型没有使用Synchronize 的结果。。。OVER
 
请问怎样同步。给我一段代码,行吗?我再加100给您。可以吗?
 
请记住VCL的访问只能在主线程中,可以使用Synchronize可以让线程的一些方法在主线程中执行。
一个简单使用Synchronize的例子:
Unit ThreadTest;
interface;
uses
classes,SysUtils;
type
TThreadTest=class(TThread)
private
Answer:integer;
protected
procedure GiveAnswer;
procedure Execute;override;
end;
implementation
uses Main;
{TThreadTest}
procedure TThreadTest.GiveAnswer;
begin
MainForm.Edit1.text:=inttostr(Answer);
end;

procedure TThreadTest.Execute;
var
i:integer;
begin
FreeOnTerminate:=True;
For i:=1 to 2000000do
begin
if Terminated then
Break;
Inc(Answer,Round(Abs(Sin(Sqrt(i)))));
Synchronize(GiveAnswer);//注意这里,并注意GiveAnswer函数。
end;
end;
end.

签名:
谢谢加分(:D)
源动力来自您的分数!!!
 
有没有vb.net或c#的啊。这个我也会啊。我从DELPHi转过去的啊。
 
Private Sub btnthread_getdata(ByVal value As DataTable) Handles objnormal.getdata, objthread.getdata
Dim m = New Threading.ThreadStart(AddressOf dataready)
mydataset = value.Copy
DataGrid1.Invoke(m)
End Sub
 
后退
顶部