Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с потоками, пару не сложных вопросов 
:(
    Опции темы
1988Олег1988
  Дата 27.7.2013, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2013

Репутация: нет
Всего: нет



Доброго времени суток.

Начал изучать работу с потоками и чем больше изучаю, тем больше вопросов

Для работы с потоком создаю 2 массива потоков в сумме их 4 штуки всего (3 потока TrLTR27 и of TrLTR51)

Код

unit MainForm;
  ...

  TForm1 = class(TForm)
  ...
  private
    { Private declarations }
  ...
    ArTrLTR27 : array  of TrLTR27;
    ArTrLTR51 : array  of TrLTR51;

  procedure WMProcessData(var Message:TMessage); message WM_PROCESSDATA27;
  procedure WMProcessData51(var Message:TMessage); message WM_PROCESSDATA51;
  ...
  end;
  ...
  procedure WMProcessData(var Message:TMessage);
  begin
  // Здесь я визуализирую данные из потока
  end;

  procedure WMProcessData51(var Message:TMessage);
  begin
  // Здесь я визуализирую данные из потока
  end;

unit ThreadLTR27;
...
 PostMessage(Form1.Handle, WM_PROCESSDATA27, NomerSlota,1 );

unit ThreadLTR51;
...
 PostMessage(Form1.Handle, WM_PROCESSDATA51, NomerSlota,1 );  //В итоге когда я пытаюсь отправить ссобщение главному потоку у меня все виснет!!!


Не подскажите почему у меня начинает виснуть прога когда я отправляю главному потоку сообщения из 2х разных
и получается, что если убрать 
 PostMessage(Form1.Handle, WM_PROCESSDATA51, NomerSlota,1 ); или второй зависание прекращается.

Прошу подсказать почему появляется зависание и как от этого можно избавиться


И второй вопрос, как можно ПРАВИЛЬНО приостанавливать и запускать поток?
У меня в потока используется бесконечный циклы
Код

while true do
begin
...
if Terminated then Break;
end;

В итоге когда я пытаюсь приостановить поток ArTrLTR27[i].Terminate;, останавливается все хорошо но пытаюсь запустить поток с помощью ArTrLTR27[i].Resume, но цикл не запускается.
PM MAIL   Вверх
Illusion Dolphin
Дата 27.7.2013, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Цитата

приостанавливать 

= Suspend

Terminate это значит дать знать потоку что он должен быть завершён.

Цитата

Прошу подсказать почему появляется зависание и как от этого можно избавиться

Когда зависнет - посмотрите на вкладку потоки (Threads = Ctrl+Alt+T), там будет указано кто кого ждёт и почему. Двойным кликом переключайтесь между потоками и будите видеть Call-stack для каждго отдельного потока.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
StranikS
Дата 28.7.2013, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.2.2006

Репутация: нет
Всего: 2



Глянул на главный код, непонятно зачем синхронизация идет через посты? Что это вам дает? Вы все равно обращаетесь к форме Form1 из каждого модуля с описанием потока.
PM MAIL   Вверх
Illusion Dolphin
Дата 28.7.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Цитата

зачем синхронизация идет через посты? Что это вам дает? 

Например, это не блокирует поток, дожидаять обработки сообщения, как это через Send.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
1988Олег1988
Дата 28.7.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2013

Репутация: нет
Всего: нет



Цитата(StranikS @ 28.7.2013,  11:39)
Глянул на главный код, непонятно зачем синхронизация идет через посты? Что это вам дает? Вы все равно обращаетесь к форме Form1 из каждого модуля с описанием потока.

Ну Посты я использовал для того чтобы не блокировать поток, дожидаясь обработки сообщения.
А то что к форме на прямую обращаюсь - это временно.

Вообще я лпанирую любые данные получаемые с потоков заполнять в некоторый глобальный список например типа SyncList:TList с доступом через крит.секцию. 

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

Но пока руки не дошли и кое где ликбеза не хватает smile ...

А может кто подскажет как можно в потоке дожидаться выполнения какой либо функции или процедуры в потоке???
например функция в потоке:
Код

Trsize:= LTR27_Recv(@ltr27_3, @Trbuf[0], nil, 16, 1000);// Здесь происходит задержка.

Но поток не дожидается ее выполнения и молотит дальше...

Это сообщение отредактировал(а) 1988Олег1988 - 28.7.2013, 14:39
PM MAIL   Вверх
Illusion Dolphin
Дата 28.7.2013, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Цитата

Но поток не дожидается ее выполнения и молотит дальше...

Предполагаю ( smile ), что проблема в реализации фкнуции LTR27_Recv  smile 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
1988Олег1988
Дата 28.7.2013, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.7.2013

Репутация: нет
Всего: нет



Цитата(Illusion Dolphin @ 28.7.2013,  15:23)
Предполагаю ( smile ), что проблема в реализации фкнуции LTR27_Recv  smile

Решил проблему - просто с переменными запутался  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.