![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки виснут [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