Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

потоки


Страницы:   1 2

аврам ©   (2008-11-08 16:39:00) 

Господа, помогите разобраться с потоками, без них трудновато делать программы с разноплановым и пересекающимися функциями.
Может есть какие полезные статьи, буду рад любой информации. Спасибо!
Особо интересует следующее: работает один поток, по мере работы результаты хранятся в каких то переменных, затем они выводятся на форму. т..е. работают с компонентами. Ну и во время рабоыт этого компонента работают еще штук 5-10 а то и больше которые работают до тех пор пока не закончит работать первый. как бы все это организовать.


Loginov Dmitry   (2008-11-11 22:51:00) [1]

> что лучше использовать для коректного завершения потоков?


для коректного завершения потокадостаточно выйти из процедуры TThread.Execute.


> нашел функцию TerminateThread, ведь есть вероятность что
> после ее использования программа врядтли будет нормально
> запускать следующие потоки.


Для программы завершение работы ее потоков с помощью TerminateThread - все равно, что вырубать комп выдёргиванием вилки из розетки. К желаемому результату это приводит, но дальнейшее правильное функционирование не гарантирует.


Аврам   (2008-11-11 22:30:00) [2]

есть непонятки с tag и waitfor...


Andy BitOff   (2008-11-11 21:42:00) [3]

> Аврам   (11.11.08 21:30) [23]

Ты Панова внимательно читал?


Аврам   (2008-11-11 21:30:00) [4]

пока работает все нормально, но теперь столкнулся с новой проблемой:
по нажатию пуск то все работает как надо, но оказалась нужной функция остановки т.е. кнопка Стоп. По нажатию на нее нужно остановить все потоки. нашел функцию TerminateThread, ведь есть вероятность что после ее использования программа врядтли будет нормально запускать следующие потоки.
что лучше использовать для коректного завершения потоков?


Сергей М.   (2008-11-11 08:12:00) [5]

А какой тогда смысл в потоке-мониторе, если запускаемые им потоки сами могут синхронизироваться между собой без чьего-либо участия ?


Аврам   (2008-11-10 21:46:00) [6]

так в потоке, я использую synchronize для передачи результатов на форму.


Сергей М.   (2008-11-10 21:41:00) [7]


> как быть если надо вывести результат на форму?


Смотря чем у тебя занят все это время основной поток ..


Сергей М.   (2008-11-10 21:40:00) [8]


> Аврам   (10.11.08 21:35) [16]


Показом результата пользователю должен заниматься поток, отвечающий именно за это, т.е. за user interface.

Этим как раз и занимается основной поток.

Когда ты в доп.потоке вызываешь  метод synchronize, ты приостанавливаешь его до момента пока основной поток не сподобится выполнить указанный параметром метод.


Аврам   (2008-11-10 21:39:00) [9]

хорошо, ну а как быть если надо вывести результат на форму?


Сергей М.   (2008-11-10 21:36:00) [10]


> Некоторые вычисления зависят от других уже вычесленных данных


Считай что одним потоком меньше, ибо смысл его существования сводится на нет


Аврам   (2008-11-10 21:35:00) [11]

тогда не опнимаю смысл работы потока, если результат его работы никак нельзя показать пользователю.


Сергей М.   (2008-11-10 21:32:00) [12]


> монитор должен уловить момент когда в определенной ячейке
> появилось значение и запустить следующий поток


Это называется "через задницу к гландам".
В идеале доп.поток недолжен иметь отношение к GUI.


Аврам   (2008-11-10 21:22:00) [13]

есть многофункциональная программа, но все функции работают по отдельности, использую   Application.ProcessMessages.
Почитал про потоки и понял что с помощью них могу запустить паралелльно работающие функции.
Представляюю ситуацию так: должнен быть поток - монитор, который создает другие потоки и следит за ихним состоянием. Т.е. поток запущенный из под монитора выполняет какие то вычисления и выводит инфу в соответствующую ячейку таблицы stringgrid. Некоторые вычисления зависят от других уже вычесленных данных, значит монитор должен уловить момент когда в определенной ячейке появилось значение и запустить следующий поток.


Сергей М.   (2008-11-10 21:13:00) [14]


> Аврам   (10.11.08 21:10) [12]


А теперь рассказывай, что собссно ты от этого кода хотел .. с чувством. с толком, с расстановкой ..


Аврам   (2008-11-10 21:10:00) [15]

уберу я showmessage, но я делал все по статье панова, которую мне посоветовали. Если в коде что не так, ткните носом, кроме showmessaga

procedure TMonitor.Execute;
var
 sqlinc: TSql_;
begin
 Synchronize(start);
 while not Terminated do
 begin
     sqlinc := TSql_.create;
     sqlinc.FreeOnTerminate := True;
     try
         Synchronize(up);
         sqlinc.OnTerminate := HandleTerminate;
         sqlinc.Resume;
     except
       synchronize(err);
     end;
 end;
   Synchronize(stop);
end;


Сергей М.   (2008-11-10 20:43:00) [16]


> почему?


Потому что ShowMessage создает vcl-форму и работает с ней.
Это как минимум.
А как максимум - весь код фтопку. Бо ты не понимаешь что в нем происходит.


Leonid Troyanovsky   (2008-11-10 20:38:00) [17]


> Аврам   (10.11.08 20:28) [6]

> закончить работу всех или некоторых потоков, если я правильно
> понимаю то у потоков должны быть хендлы, как мне их получать

Записывать их бесполезно.
А так - TThread.Handle.

--
Regards, LVT.


Аврам   (2008-11-10 20:35:00) [18]

почему?


Сергей М.   (2008-11-10 20:35:00) [19]

Нельзя.


Аврам   (2008-11-10 20:33:00) [20]

можно использовать так?

procedure TMonitor.han;
begin
 form1.Memo3.Lines.Add(inttostr(name_h));
end;

procedure TMonitor.Execute;
begin
 ...
     try
         Synchronize(up);
         sqlinc.OnTerminate := HandleTerminate;
         sqlinc.Resume;
         name_h := sqlinc.Handle;
         Synchronize(han);
     except
       ShowMessage('Fucking error!');
     end;
...
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо