Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизМастера, подскажите! есть поток, при нажатии делает опр. действия Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c