Форум: "Основная";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
ВнизКакие могут быть причины не попасть в код потока после Resume? Найти похожие ветки
← →
Kolan © (2007-06-05 16:13) [0]Вот начало кода потока:
procedure TPackageExtractor.Execute;
begin
while not Terminated do
begin
//
LogManager.WriteString("while not Terminated do");
//
Ту есть запись в лог.
В опр ситуациях поток засыпает(Suspend
).
И в опр ситуациях его будят(Resume;
).
По логу видно что Resume
← →
Kolan © (2007-06-05 16:14) [1]По логу видно что Resume отрабатывает. А до
while not Terminated do
дело не доходит почему так может быть?
ЗЫ
Сор, первый пост — случайно нажал «отправить».
← →
Сергей М. © (2007-06-05 16:19) [2]А что говорит отладчик ?
← →
Kolan © (2007-06-05 16:22) [3]> А что говорит отладчик ?
Да отладчиком не пройдешь тк незнаю как попасть на проблемму. Из 1000 раз нормальной работы 1 раз ж*па, поэтму лог — все что есть для отладки…
← →
Сергей М. © (2007-06-05 16:30) [4]
> отладчиком не пройдешь тк незнаю как попасть на проблемму
Ставь брейкпойнт наwhile not Terminated do
и лови, в чем проблема-то ?
← →
Kolan © (2007-06-05 16:35) [5]> while not Terminated do
Дык яж говорю на тысячу операций один раз облом. А в каждой операции циклwhile not Terminated do
прокручивается 29(примеро) раз. Итого 29000раз. Сами понимаете просто F9 не понажимаешь :(
← →
Eraser © (2007-06-05 16:36) [6]> Kolan ©
глянуть бы код создания потока.
← →
Kolan © (2007-06-05 16:38) [7]> глянуть бы код создания потока.
constructor TPackageExtractor.Create(StartByte, EndByte: Byte);
begin
inherited Create(False);
SetLength(FBuffer, AverageBufferSize);
FreeOnTerminate := True;
FReadIndex := 0;
FWriteIndex := 0;
FWaitState := wsWaitForStart;
FStartByte := StartByte;
FEndByte := EndByte;
FBufferCriticalSection := TCriticalSection.Create;
FReadWriteCriticalSection := TCriticalSection.Create;
FWaitStateCriticalSection := TCriticalSection.Create;
FPackageAgesCriticalSection := TCriticalSection.Create;
FReceiveStaffer := TReceiveStaffer.Create(FStartByte, FEndByte);
end;
← →
Eraser © (2007-06-05 16:41) [8]> [7] Kolan © (05.06.07 16:38)
эээ.. немного не это имел ввиду, имел ввиду участок кода, где
TPackageExtractor.Create() вызывается...
может лог косячит?
← →
Kolan © (2007-06-05 16:41) [9]Вот когда все ок:
Resume;
//
LogManager.WriteString("");
LogManager.WriteString("Поток извлечения пакетов запущен.");
LogManager.WriteByteArray(Arr, "Поток извлечения получил");
LogManager.WriteByteArray(FBuffer, "Циклический буфер");
LogManager.WriteString("Длинна цикл. буфера"+IntToStr(Length(FBuffer)));
LogManager.WriteString("Индекс чтения:"+IntToStr(ReadIndex));
LogManager.WriteString("Индекс записи:"+IntToStr(WriteIndex));
LogManager.WriteInteger(Integer(WaitState));
//204139 16:16:56:671 Поток извлечения пакетов запущен.
204140 16:16:56:671 Поток извлечения получил: [ (Hex mode) AA 02 01 23 D7 00 00 00 0D F4 02 82 01 00 ]
204141 16:16:56:671 Циклический буфер: [ (Hex mode) FF AA 02 01 23 D7 00 00 00 0D F4 02 82 01 00 2A 00 01 4E 65 62 41 FD FA 55 FF FF AA 02 01 23 BD 00 00 00 0D 0F 02 82 01 00
2A 00 01 3F AF 45 41 FD DB 55 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
204142 16:16:56:671 Длинна цикл. буфера100
204143 16:16:56:671 Индекс чтения:1
204144 16:16:56:671 Индекс записи:15
204145 16:16:56:671 0
204146 16:16:56:671 while not Terminated do
204147 16:16:56:671 wsWaitForStart
А кошда облом:207071 16:16:57:203 Поток извлечения пакетов запущен.
207072 16:16:57:203 Поток извлечения получил: [ (Hex mode) 2A 00 01 81 DD 4B 41 FD 65 55 FF FF ]
207073 16:16:57:203 Циклический буфер: [ (Hex mode) FF AA 02 01 23 E7 00 00 00 0D E4 02 82 01 00 2A 00 01 81 DD 4B 41 FD 65 55 FF FF AA 02 01 23 BD 00 00 00 0D 0F 02 82 01 00
2A 00 01 3F AF 45 41 FD DB 55 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
207074 16:16:57:203 Длинна цикл. буфера100
207075 16:16:57:203 Индекс чтения:15
207076 16:16:57:203 Индекс записи:27
207077 16:16:57:203 1
207078 16:16:58:984 {Общая информационная команда для пользователя. Cтрока: «Время ожидания вышло.». | TCustomUserMessageCommand}.
Что он делает почти две секунды непонятно.
← →
Kolan © (2007-06-05 16:43) [10]> эээ… немного не это имел ввиду, имел ввиду участок кода,
> где
> TPackageExtractor.Create() вызывается…constructor TConnectionManager.Create;
begin
///
FPackageExtractor := TPackageExtractor.Create(StartByte, EndByte);
FPackageExtractor.PackageReceivedEvent := PackageReceivedEvent;
///
end;может лог косячит?
Нет ошибка есть реально. Обмнен прекрашается с устройством это все у меня на глазах.
← →
Сергей М. © (2007-06-05 16:53) [11]
> Kolan © (05.06.07 16:35) [5]
Контроль и протоколирование непредвиденных исключений в теле Execute тобой организован ?
← →
Loginov Dmitry © (2007-06-05 17:00) [12]Так понял, ты создаешь еще несколько вспомагательных потоков (иначе к чему создание критической секции в конструкторе). Нет ли у этих потоков какой-либо искусственной задержки в методе Execute?
← →
Kolan © (2007-06-05 22:02) [13]Тема актуальна, но отвечу завтра :)
← →
Evgeny V © (2007-06-06 13:11) [14]Совет - не использовать Suspend-Resume для управления ходом выполнения потока...
> constructor TPackageExtractor.Create(StartByte, EndByte:
> Byte);
> begin
> inherited Create(False);
А во первых строках моего письма.... никто не гарантирует, что выполнение Execute не начнется раньше, чем например выполниться в конструкторе
> FBufferCriticalSection := TCriticalSection.Create;
> FReadWriteCriticalSection := TCriticalSection.Create;
> FWaitStateCriticalSection := TCriticalSection.Create;
> FPackageAgesCriticalSection := TCriticalSection.Create;
>
> FReceiveStaffer := TReceiveStaffer.Create(FStartByte, FEndByte);
>
> end;
Что может привести к проблемам....
← →
Loginov Dmitry © (2007-06-06 13:39) [15]> никто не гарантирует, что выполнение Execute не начнется
> раньше, чем например выполниться в конструкторе
Я гарантирую. Теперь веришь? )))
← →
Evgeny V © (2007-06-06 13:50) [16]
> Loginov Dmitry © (06.06.07 13:39) [15]
Нет не верю, так как поток у него создан и запущен сразу Create(Suspended:=false), а это уже классика, описанная много где, никто не гарантирует, что до выполнения команды А, поток не будет остановлен и не будет передано управление другому потоку для выполнения команды B.... Может 100 раз выполнится нормально, а на 101 сразу запустит поток на выполнение
← →
Loginov Dmitry © (2007-06-06 13:57) [17]А если глянуть на реализацию
TThread.AfterConstruction
?
← →
Evgeny V © (2007-06-06 14:29) [18]
> Loginov Dmitry © (06.06.07 13:57) [17]
> А если глянуть на реализацию
> TThread.AfterConstruction
> ?
Сорри, согласен. Хотя помнится мне, что в 5 версии дельфи(билдера) это было не так реализовано, то есть запуск приосходил сразу после вызова базового конструктора.... Потому и сказал так. http://qc.borland.com/wc/qcmain.aspx?d=6137 - это поискал, ибо 5 дельфи уже нет у меня.
← →
Kolan © (2007-06-06 14:39) [19]Решил не отлаживать. Переписал кусок подругому(не без помощи). Потока этого вообще теперь нет. как говорится:
«Нет потока нет проблеммы» :)
Благодарю за участие в обсуждении.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c