![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подвисание... [D7, WinXP]
Bes © (2003-09-11 01:06:00)
Вообщем я содаю 25 потоков с одинаковыми действиями, но разными входными параметрами...
все нормально работает, но вот только программа моя подвисает пока потоки работают...
я создал еще один отдельный поток и засунул туда Application.ProcessMessage; и это тоже не помогло, как сделать так чтоб программа реагировала и не подвисала...
Bes (2003-09-11 20:17:00) [21]
я посмотрел пример... но че та я прикола не понял...
вот мое предположение если Synchronize(DoWork) то процедура DoWork выполняется не в отдельном потоке а в главном, если же не просто в Execute"e писать какие-то действия то все выполняется в новом потоке (отдельном) так или нет ?
Verg (2003-09-11 13:10:00) [22]
Примерчик лежит у тебя под носом:
C:\Program Files\Borland\Delphi7\Demos\Db\BkQuery\
Bes (2003-09-11 13:00:00) [23]
2 han_malign © ну в принципе ис Priority=tpNormal; тоже самое...
2 Varg ну а как разделить их... если можно примерчик или ссылчку
Verg (2003-09-11 12:51:00) [24]
Дык у тебя всю работу, за все 25 потоков делает один поток - главный.
Вся суть твоих потоков - это и есть нагрузить Synchronize главный поток.
Т.е. чего получается, каждому грузчику раздали по мешку, тык нет чтобы их таскать, они нашли "крайнего", и стоят в очереди к нему.... ну, чтобы он таскал по очереди их мешки.
han_malign (2003-09-11 12:44:00) [25]
>Priority:=tpTimeCritical;
- ну-ну...
Bes (2003-09-11 12:39:00) [26]
Вот код:
...
type
TTh=class(TThread)
private
path:string;
id:integer;
protected
procedure DoWork;
procedure Execute; override;
public
constructor Create(s:string;i:integer);
end;
...
var
t: array [0..50] of TTh;
...
...
constructor TTh.Create(s:string;i:integer);
begin
path:=s;
id:=i;
inherited Create(false);
end;
...
procedure TTh.Execute;
begin
Priority:=tpTimeCritical;
Synchronize(DoWork);
end;
...
...
procedure TTh.DoWork;
var
stat,dt,st:string;
begin
try
aq[id]:=TadoQuery.Create(form2);
aq[id].CursorLocation:=clUseServer;
...
..
.
aq[id].Close;
aq[id].Free;
dec(thread_count);
end;
...
...
procedure TForm1.Button1Click(Sender:TObject);
var
i:integer;
begin
for i:=0 to listbox1.items.count-1 do
t[i]:=TTh.Create(listbox1.items.strings[i],i);
end;
...
не знаю где трабла...
y-soft (2003-09-11 09:55:00) [27]
>MBo © (11.09.03 09:49) [5]
Есть большие подозрения, что автор не подумал о таких вещах...
Так что, действительно, без кода ничего не посоветовать...
MBo (2003-09-11 09:49:00) [28]
>y-soft © (11.09.03 09:34) [4]
>А не многовато 25 одновременно работающих потоков на 1 процесс?
Ведь если они нормально применяются - большинство потоков ждут событий, не крутясь вхолостую, то это не особо напрягает.
Как бы то ни было, без подробностей ничего сказать нельзя.
y-soft (2003-09-11 09:34:00) [29]
А не многовато 25 одновременно работающих потоков на 1 процесс?
Первичный поток при такой перегрузке может получать управление очччень редко :)
Verg (2003-09-11 09:34:00) [30]
> как сделать так чтоб программа реагировала и не подвисала...
Грамотно проектировать потоки.
Digitman (2003-09-11 09:13:00) [31]
> я создал еще один отдельный поток и засунул туда Application.ProcessMessage
глупее не придумаешь)
какое ты имеешь право вызывать метод VCL-объекта TApplication без синхронизации с осн.код.потоком ?
> и это тоже не помогло
при таком подходе к исследованию проблемы рискну спросить : а Вы их дустом не пробовали ?)
p.s.
Ну а если серьезно, то приводи весь код, относящийся к классу проблеммного потока.
без кода - пустой треп
BorH (2003-09-11 03:09:00) [32]
Пробовал уменьшить количество потоков? Если тот же эффект, значит, что-то в коде не то...
А вообще скинь сюда, как ты строил их (ну, исходники). Посмотрим все вместе.