Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1377
Sliski Slimak
2003-08-16 20:48
2003.09.01
Господа,как создать ресурс с 24-bitным битмапом?


3-1326
BigError
2003-08-07 20:49
2003.09.01
MySQL - вопрос по libmySQL.dll (+)


1-1480
m2003
2003-08-17 14:06
2003.09.01
EAccessViolation при создании экзэмляра класса


1-1438
Бэк
2003-08-19 08:51
2003.09.01
Получение параметров, переданных в командной строке


14-1552
SPeller
2003-08-12 06:23
2003.09.01
Зарплата чиновников





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский