Форум: "Основная";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];
ВнизПотоки виснут Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c