Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.018 c
1-72285
Юра
2003-01-15 11:52
2003.01.23
Создавать формы сразу или динамически?


8-72419
Link
2002-10-06 14:54
2003.01.23
Распечатка графика


1-72325
Pirat
2003-01-15 19:18
2003.01.23
Максимизированное окно перекрыло даже Taskbar :(


14-72496
sancho
2003-01-05 19:23
2003.01.23
RTL порт


8-72417
Sam Stone
2002-09-29 21:44
2003.01.23
Movie





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский