Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

Потоки виснут   Найти похожие ветки 

 
Boris Tyumnev   (2003-01-13 02:58) [0]

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


 
Digitman ©   (2003-01-13 08:53) [1]

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


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

Ошибка, очевидно, в 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.

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


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

со старым новым годом!!!
а зачем две кнопки???
по-моему,
одной достаточно
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;


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

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


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

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

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


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

Удачи.


 
Evgeny V ©   (2003-01-14 04:57) [5]

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


 
Separator ©   (2003-01-14 07:12) [6]

Нужен код Execute



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

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
1-72255
BigBadMutuh
2003-01-12 15:14
2003.01.23
Как сохранить базу данных в txt-файл


1-72292
fifo
2003-01-15 12:57
2003.01.23
VarArrayCreate c типом Record


4-72613
Ifuty
2002-12-07 18:49
2003.01.23
Jan_coo player.


3-72064
Serginio
2002-12-30 16:04
2003.01.23
Бдешный Upper( Я )<>Upper( я )


3-72124
race1
2002-12-30 14:38
2003.01.23
скорость