我有一个关于多线程下载的问题,因为你知道使用多个线程下载可以提高应用程序的性能,但是有一些措施要尊重:比如线程数,可用带宽等等,但我真的不明白,为什么例如,使用多个线程可能会降低应用程序的性能,或者服务器的带宽,质量如何影响多线程应用程序的性能?,monothread下载比多线程更快的情况是什么?
谢谢你的回复.
我正在使用PostMessage从其他单元发送消息到主表单,如下所示:
procedure notify(var Message: TMessage); message 1;
Run Code Online (Sandbox Code Playgroud)
在程序中,信息显示如下WParam:
procedure TForm1.notify(var Message: TMessage);
begin
Case (Message.WParam) of
1: memo1.Lines.Add('task started');
2: memo1.Lines.Add('in progress');
end;
end;
Run Code Online (Sandbox Code Playgroud)
在另一个单元中,我发送这样的消息:
PostMessage(Handle, 1, 2, variable_info);
Run Code Online (Sandbox Code Playgroud)
首先,什么是消息ID?我将它替换为1,因为它的类型是基数,我应该使用什么呢?我的消息永远不会收到,因为Message.WParam它永远不会等于1或2.我的代码有什么问题?
我编辑了这样的代码:unit1
const
WM_MY_MESSAGE = WM_USER + 0;
Run Code Online (Sandbox Code Playgroud)
在代码中我添加了这样的东西:
PostMessage(Handle,WM_MY_MESSAGE, 1,value_sent);
Run Code Online (Sandbox Code Playgroud)
TFormUnit:
private
procedure notify(var Message :TMessage); message WM_MY_MESSAGE;
procedure TFormMain.notify(var Message: TMessage);
begin
Case (Message.WParam)of // which is 1
1:
//------------------------------------------
begin
memo1.Lines.Add('task started');
Run Code Online (Sandbox Code Playgroud)
通常在PostMessage(Handle,WM_MY_MESSAGE,1,value_sent)时; 执行我应该启动消息任务,但它是相同的错误,没有任何反应!
我正在开发一个多线程的下载应用程序.我有一个线程创建了许多线程,可以下载数据.在下载时我需要查看进度条的进度,所以我将最大值设置为文件的大小,并使用IdHTTPWork计算当前下载的数据,我将其添加为线程(辅助线程)的过程.当我的应用程序启动时,主线程创建其他线程下载(在循环中)并设置开始和结束的位置(idhttp.request.range),然后每个线程开始下载,如下所示:
HTTP.Request.Range := Format('%d-%d',[begin ,end]);
HTTP.Get(url,fs);
Run Code Online (Sandbox Code Playgroud)
这是secondarythread.work的过程:
procedure TSecondaryThread.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
if AWorkMode = wmRead then
position:= AWorkCount;// position is a global variable
SendMessage(HWND_BROADCAST,MyMessage, 2,position);
end;
Run Code Online (Sandbox Code Playgroud)
我不知道这是不是正确的代码,但我找不到另一种解决方案.每个线程都可以使用下载数据的值来增加位置,因此位置将包含瞬时S中的全局下载,我不知道这是否属实.现在我的问题:1-进度与当前下载的数据量不对应; 相反,它增量非常缓慢.2 - 当我添加-just当我在此过程中添加-Asend消息时,它永远不会停止工作!那么问题是什么?谢谢
如何通过将progressBar的一部分设置为空(例如0 - > 50)来更改progressBar的起始位置,并从50.开始进度(绿色),那么有没有具体方法可以做到这一点?