Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: CL | DM;

Вниз

Мастера, подскажите! есть поток, при нажатии делает опр. действия   Найти похожие ветки 

 
Layner   (2003-08-18 15:17) [0]

Этих действий иногда бывает много ~400 в день, т.е. 400 нажатий на кнопку, иногда 1, как сделать сущ. поток в цикле? Возможно ли вот этот самый код в поток вставить, и повторять его сколько угодно, 400 и т.п.? Т.е. получится так, что гл. потоке запускается другой поток (GT)?

procedure Tf.Button1Click(Sender: TObject);
begin
GT := TGoThread.Create (False); // start
GT.FreeOnTerminate := True;
Button1.Enabled:=False;
end;


 
Layner   (2003-08-18 15:25) [1]

Ещё вопрос, если можно ^, то как из общего потока передать сл. переменную в GT? Если как обычно, через Public (или privat), объявить, то тогда понятно.


 
Е-Моё имя ©   (2003-08-18 15:31) [2]

чо-то не понял ничо
за сим откланяюсь


 
Layner   (2003-08-18 15:32) [3]

Вернее не переменную, а что выполнился GT, и можно снова выполнить GT, но с другими параметрами.


 
Е-Моё имя ©   (2003-08-18 15:33) [4]

мой тебе добрый совет
задай вопрос заново
предварительно прочитав написанное


 
Layner   (2003-08-18 15:56) [5]

В обшем, из потока поток можно вызывать?


 
Verg ©   (2003-08-18 16:08) [6]

Вызываются процедуры или методы, а потоки создаются.
Поток может вызвать что-то, а не что-то вызвать поток.
Поток может создать другой поток.


 
Layner   (2003-08-18 16:30) [7]


unit Units_thread;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB, ExtCtrls, FileCtrl;

type
TGoThread = class(TThread)

private
procedure AddStr;
str: String;

protected
procedure Execute; override;
end;

implementation

uses
main;

procedure TGoThread.Execute;
var
i:integer;
begin
for i:=1 to 200000 do begin
str:=IntToStr(i);
Synchronize(AddStr);
end;

end;

procedure TGoThread.AddStr;
begin
Memo1.Lines.Add(str);
end;

end.


Событие по нажатию, создаем и запускаем поток, модуль main


procedure Tf.Button1Click(Sender: TObject);
begin
GT := TGoThread.Create (False); // start
GT.FreeOnTerminate := True;
end;


^^ это мы запустили и выполнили поток всего 1 раз. Он выполнился.

Нужно, чтобы поток отработал не 1 раз, а например 10. И сделал 10 действий таких как в коде, который я привел. По 1 нажатию кнопки.

Незнаю как ещё объяснить, но мне надо примерно такой код (ясно, что он работать не будет)


procedure Tf.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 10 do begin
GT := TGoThread.Create (False); // start
GT.FreeOnTerminate := True;
end;
end;


 
Layner   (2003-08-18 16:32) [8]

Это не паралельные потоки!! а как только закончился 1, начался 2й, закончился 2, начался 3й и т.д.


 
Verg ©   (2003-08-18 16:42) [9]

Ну, и в чем проблем?
Нужен-то всего один поток, раз "они"
> не паралельные



> procedure TGoThread.Execute;
> var
> i,j:integer;
> begin
for j:=1 to 10 do // Сколько надо столько и сделал
if Terminated then exit else

> for i:=1 to 200000 do begin
> str:=IntToStr(i);
> Synchronize(AddStr);
> end;
>
> end;


Похоже ты неверно формулируешь вопрос.
Дай угадать:
Поток должен по команде проделать что-либо N раз и снова ждать команды.
А?


 
Layner   (2003-08-18 16:55) [10]

Verg ©, вот и не так, так я бы добавил цикл в рабочем своём потоке и проблемы нет, а вот хотел так сделать, короче есть файлы, формата XML, но это без разницы. Лежат они в одной дирректории. Оператор приходит утром, смоторит, есть файл, выделяет его в FileListBox, нажимает кнопку, и файл парсируется. Если в дирректории несколько файлов, то такое событие оператор проделывает несколько раз. Иногда бывает файлов много. Или надо срочно парсировать файлы за полгода.
Я сделал в FileListBox мультиселект, принимаю все веделенные файлы, а дальше??? Имею список файлов, и все. Хотел бы сделать главный поток, который запускается и запускает дочерние поток за потоком, пока все файлы не обработаются.
Хотя... да, можно сделать как у меня сделанно, только добавить ещё один цикл, по файлам. Это легко. Я думал по другому. Не поток-цикл-цикл. А цикл-поток-поток.
Но всё таки, если есть др. варианты, интересно бы узнать ...


 
Verg ©   (2003-08-18 17:04) [11]

Поверь, создавать и уничтожать потоки при том, что еще они и не должны работать паралелльно - это гружево.
Зачем?
Пусть этот поток, который парсит файл, будучи однажды созданным, спит и ждет либо сообщения в своей очереди (команду фас, так сказать) либо окончания своей жизни (Terminated). Главный же поток, когда ему надо пропарсить список файлов проделает postthreadmessage столько раз сколько у него в списке файлов.

Другое дело, если б тебе надобыло параллельно пропарсить набор файлов. Тогда создаешь таких потоков по количеству файлов, сообщив каждому в конструкторе, например, имя файла и запускаешь их всех...


 
Layner   (2003-08-18 17:14) [12]

Вот бы, Verg, увидеть примерчик использования параллельного использования, по кол-во файлов, на очень примитивной(простой) теме... Есть marcocantu исходники, да не нашёл там этого, если есть у Вас, то очень бы был признателен, может тоже чем нибудь помог, написал бы в ответном письме. Или здесь.


 
panov ©   (2003-08-18 17:21) [13]

Почитай статьи на сайте.


 
Verg ©   (2003-08-18 17:52) [14]

TGoThread = class(TThread)
private
FFileName : string;
protected
procedure Execute; override;
public
constructor Create(const AFileName : string);
end;

implementation
constructor TGoThread.Create(const AFileName : string);
begin
inherited Create(true);
FFileName:=AFileName;
FreeOnTeriminate:=true;
resume;
end;

procedure TGoThread.Execute;
var F : system.text;
begin
system.Assign(F, FFileName);
try
Reset(F);
try
// Ну вот, здесь поток GoThread может парсить файл
finally
system.close(F);
end;
except
// разбор ошибок
end;
end;

Допустим главный поток каким либо образом получил список файлов в FileList : TStringList;

for i:=0 to FileList.Count-1 do
TGoThread.Create(FileList[I]);

все, "процесс пошел" :)

Намечается следующий вопрос: Как узнать, что все файлы в этом списке обработаны (потоки отработали)?
На это есть тоже куча способов, извини, сейчас некогда....



Страницы: 1 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
1-1414
Aleksandr
2003-08-15 14:41
2003.09.01
Как освободить спящий поток?


1-1454
Still_Swamp
2003-08-19 17:14
2003.09.01
Прочитать в TMemoryStream


8-1519
Roka
2003-04-21 13:10
2003.09.01
slider аля шатл


14-1623
wl
2003-08-13 14:41
2003.09.01
Опять форум атаковали....


14-1606
moniker
2003-08-13 19:15
2003.09.01
Добрый вечер :)