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

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

Потоки виснут [D6, D7, Win95/98, Win2k]


Boris Tyumnev ©   (2003-01-13 02:58:00) 

Есть такая проблема:
Форма - на ней две кнопки.
Одна делает второму потоку Suspended := True, а другая Suspended := False;, т.е. Play, Pause.
В потоке крутиться цикл, который последовательно вызывает функцию загруженную из DLL, полученные оттуда данные отрисовывает на Canvas (через Synchro), изменяет значения полей (edit-box"ов) (тоже через Synchro), и увеличивает значение переменной через Inc.
Все бы хорошо, но возникает такой глюк:
Когда начинаешь нажимать Play, Pause, Play, Pause и т.д. прога виснит на мертво. Причем может повиснуть после 2 повтора, а может после 30ого. И виснет в Win9x, Win2k Prof, а в Win2k Server нет.
В чем здесь может быть дело? Или хотя бы направление поиска.
Заранее спасибо.


Separator   (2003-01-14 07:12:00) [1]

Нужен код Execute


Evgeny V   (2003-01-14 04:57:00) [2]

Я бы рекомендовал пользоваться методами Suspend - стоп и Resume -запуск


Dima1   (2003-01-14 02:54:00) [3]

К компонентам на форме, из потока, всегда надо обращатся через функцию Synhronize(). Кажется так пишется.


procedure ToEdit(Val : String);
begin
Form1.Edit1.Text := Val;
end;

А вот ее вызов.

...
Synhronize(ToEdit("Ok"));
...


и так со всеми компонентами.

Удачи.


VeshchiyOleg   (2003-01-14 00:10:00) [4]

со старым новым годом!!!
а зачем две кнопки???
по-моему,
одной достаточно
procedure btnClick(Sender: TObject);
begin
if Assigned(TThread(ProcessHandle)) then
with TThread(ProcessHandle) do begin
Suspended := not Suspended;
if Suspended then
btn.Caption:="Продолжить"
else btn.Caption:="Пауза";
end;
end;


Alex Konshin   (2003-01-13 09:00:00) [5]

Ошибка, очевидно, в 17-ой строчке.

А если серьезно, могу посоветовать прием, который я использую для отладки multithread приложений.
Отлаживать их трудно, использовать отладчик IDE практически бесполезно, да и глючит в этом случае. Поэтому использую старый добрый прием - печать сообщений, но, естественно, не на консоль и не в файл, а через OutputDebugString. Сообщения смотрю с помощью debugView ( http://www.sysinternals.com/ntw2k/freeware/debugview.shtml), который, кстати, может смотреть их с другой машины.

Использую следующую поцедуру:

procedure Debug( const AFormat: String; Args: Array of const );
begin
try
OutputDebugString(PChar(Format(AFormat,Args)));
except
on E:Exception do
OutputDebugString(PChar(E.ClassName+" on OutputDebugString(PChar(Format("+Quote(AFormat)+",[...])))"));
end;
end;


В коде вставляю фрагменты вроде этого:


{$ifdef debug}
Debug("%.4x AcntFilers.ReadCompletionRoutine: Handler=%.8x CurrentJob=%.8x",[GetCurrentThreadId,DWORD(oHandler),DWORD(oHandler.FCurrentJob)]);
{$endif}


Когда отлаживаюсь, вставляю в начало модуля {$define debug} или
в Project->Options->Directories/Conditions->Conditional Defines.

Ну, понятно, возможны и вариации на эту тему.


Digitman   (2003-01-13 08:53:00) [6]

Приведи код Execute() и код, реализующий св-во Suspended


Наверх

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