大家给我看看我的多线程写的对吗?(90分)

  • 主题发起人 主题发起人 zzandyzh
  • 开始时间 开始时间
Z

zzandyzh

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TSendThread.Execute;
var
Request : TStrings;
begin
while snum<=enumdo
begin
application.ProcessMessages;
sleep(1);
try
idhttp:=tidhttp.Create(nil);
Synchronize(setdata);
//一个过程
idhttp.CookieManager:=IdCookieManager1;
idhttp.HandleRedirects:=true;
idhttp.AllowCookies:=true;
idhttp.ReadTimeout:=strtoint(trim(form1.edit27.text));
//设置超时
//设置代理服务
if form1.CheckBox1.Checked then

begin
idhttp.ProxyParams.ProxyServer:=trim(form1.Edit5.Text);
idhttp.ProxyParams.ProxyPort:=strtoint(trim(form1.Edit6.text));
if form1.CheckBox2.Checked then
begin
idhttp.ProxyParams.ProxyUsername:=form1.Edit8.Text;
idhttp.ProxyParams.ProxyPassword:=form1.Edit9.Text;
end;
end;


synchronize(Setdatas); //一个过程
Request := TStringList.Create ;
request.Clear ;
request.add(trim(form1.edit13.text)+'='+(form1.edit2.text))
request.Add(trim(form1.edit15.text)+'='+(edits))
request.Add(trim(form1.edit12.text)+'='+(form1.Edit1.Text));
request.Add(trim(form1.edit14.text)+'='+(form1.Edit3.Text));

//打开链接
if trim(form1.edit24.text)<>'' then
begin
try
html1:=idhttp.Get(url);
except
idhttp.Disconnect;
continue;
end;
end;

try

html:=idhttp.Post(eurl,request);
except
idhttp.Disconnect;
continue;
end;

form1.Memo4.Text:=html;
idhttp.OnRedirect:=IdHTTPRedirect;
finally
request.Free;
  idhttp.Free;
end;
application.ProcessMessages;
sleep(100);
end;
end;
为什么运行时点用Cpu资源100%?没多少分了,全给了!
 
你把动态创建的那些代码放到循环外面吧,要不然象你这样没1秒钟要动态创建10遍,系统资源再多也扛不住的啊。
 
同意楼上的。然后再看看你的 条件:snum<=enum 代码里没有控制这个变量的变化,什么进修退出呀。
 
问题是我每循环一次,变量就会变一次啊!
我的循环条件在setdata这个过程中
比如:Url等
我觉得和我的Idhttp有关系,因为在这个线程中要执行两次,一次是GET,一次是Post!
你以前写的只有Get一次,就没出现过这种情况!
哦,还有一个问题就是,怎么才能暂停,继续,停止此线程?
 
Delphi技术联盟群:23889386
 
是的,系统在做重复性动作, 应该放在循环外面.
多线程不会让你的cpu一直到100%
 
那我的变量该怎么做?
 
1。把application.ProcessMessages;去掉
2。无论你用多少try,记住Create(nil);要在try的外面
 
暂停suspend,恢复resume,停止Terminate
 
多线程内不要直接去引用主窗体的VCL!!!
 
还是不行啊!
 
你什么不用纯API处理线程.......VCL的数据在建线程传数据进入..得数据用SendMessage

////初始化服务线程.....
hThreadForMsg := CreateThread(nil, 0, @LoadAccountRecords, nil, 0, dwThreadIDForMsg);
SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(0, 0), integer(pchar('Ready')));
....................
function LoadAccountRecords(lpParameter:pointer):UINT;stdcall;
begin
while truedo
begin
//.........do...
SleepEx(5,true);
end;
result:=0;
end;
 
to wlong01
我不太明白,不好意思,能请的详细点吗?
 
后退
顶部