Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

потоки   Найти похожие ветки 

 
аврам   (2008-11-08 16:39) [0]

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


 
Сергей М. ©   (2008-11-08 16:44) [1]


> как бы все это организовать


TThread.Synchronize


 
Palladin ©   (2008-11-08 16:45) [2]

http://www.delphimaster.ru/articles/panov/


 
аврам   (2008-11-08 23:05) [3]

где то читал что работать ппотокам с vcl не хорошо, почему? но все же результаты работы потоков должны отображаться на форме, как это правильней делать?
спасибо!


 
unassigned   (2008-11-08 23:54) [4]


> аврам   (08.11.08 23:05) [3]
> где то читал что работать ппотокам с vcl не хорошо, почему?
>  но все же результаты работы потоков должны отображаться
> на форме, как это правильней делать?спасибо!


несколько способов точно есть:
1: через критические секции;
2: отправить сообщение SendMessage(Handle -окна, WM_USER+1, Wparam, lParam); отправка собщения блокирует поток, пока не бедет обработана функция SendMessage()
3 : PostMessage() тоже что и SendMessage() тока не блокируется отпраляющий поток


 
Loginov Dmitry ©   (2008-11-09 00:02) [5]

> где то читал что работать ппотокам с vcl не хорошо, почему?
>


Каждый визуальный элемент VCL представляет собой окно Windows. При создании окна с ним ассоциируется оконная функция. В дальнейшем любая работа пользователя с окном приводит к вызову оконной фукнции (на деле все немного сложнее). Оконная функция всегда работает в том же потоке, в котором было создано окно (в VCL-в основном потоке), ее можно вызвать только если послать окну сообщение (напр. с помощью SendMessage или PostMessage). Для изменения любых свойств созданного окна ему также следует послать SendMessage или PostMessage. Однако вызов SendMessage из основного потока VCL приводит непосредственно в вызову оконной функции без участия очереди обработки сообщений. В VCL работу с сообщениями упростили, добавив в TControl метод Perform. Теперь практически всюду вместо SendMessage используется метод Perform. Фишка в том, что если из дополнительного потока вызвать Perform (т.е. изменить любое свойство визуального компонента, например TControl.Caption), то сразу будет вызвана оконная функция. Но в этом случае она будет использоваться не по назначению, ей положено работать в основном потоке! Резонно, что подобное явление обязательно будет приводить к накладкам, т.к. будут возникать ситуации, при которых одно и тоже свойство, одна и таже переменная будет изменяться/читаться одновременно из 2х потоков и т.п. Естественно, проблема здесь не в самом методе Perform, а в синхронизации между потоками. Синхронизация позволяет предотвратить одновременный разрушительный доступ к ресурсу из нескольких потоков. В частности, для предотвращения доступа к VCL из дополнительного потока предусмотрен перегруженный метод TThread.Synchronize. Он работает практически как и SendMessage(), т.е. посылает окну Application.Handle определенное сообщение и адрес объектного метода. Оконная функция Application, работающая в основном потоке, обработает полученное сообщение и выполнит вызов заданного метода (в упрощенном виде механизм примерно так и выглядит). После того, как выполнение метода завершится, дополнительный поток вновь продолжит свою работу.


 
Аврам   (2008-11-10 20:28) [6]

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


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

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

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;


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

Нельзя.


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

почему?


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


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

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

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

--
Regards, LVT.


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


> почему?


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


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

уберу я 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 21:13) [13]


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


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


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

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


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


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


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


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

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


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


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


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


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

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


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


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


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

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

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


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


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


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


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

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


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

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


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

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


 
Andy BitOff ©   (2008-11-11 21:42) [24]

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

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


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

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


 
Loginov Dmitry ©   (2008-11-11 22:51) [26]

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


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


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


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



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

Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.046 c
2-1226476773
leonidus
2008-11-12 10:59
2008.12.21
Непонятки с TStringGrid


11-1193584312
Danger
2007-10-28 18:11
2008.12.21
Подправить MCKmdvPanel.pas


2-1226410134
***mikle***
2008-11-11 16:28
2008.12.21
сбивается указатель


1-1204819636
darkcoder
2008-03-06 19:07
2008.12.21
twebbrowser Как получить ссылки на которые ведут картинки?


4-1202310065
lead-in
2008-02-06 18:01
2008.12.21
"Шифровка по Виндусовски"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский