![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какие могут быть причины не попасть в код потока после Resume?
Kolan © (2007-06-05 16:13:00)Вот начало кода потока:
procedure TPackageExtractor.Execute;
begin
while not Terminated do
begin
//
LogManager.WriteString('while not Terminated do');
//
Ту есть запись в лог.
В опр ситуациях поток засыпает(Suspend).
И в опр ситуациях его будят(Resume;).
По логу видно что Resume
Kolan (2007-06-06 14:39:00) [1]Решил не отлаживать. Переписал кусок подругому(не без помощи). Потока этого вообще теперь нет. как говорится:
«Нет потока нет проблеммы» :)
Благодарю за участие в обсуждении.
Evgeny V (2007-06-06 14:29:00) [2]
> Loginov Dmitry © (06.06.07 13:57) [17]
> А если глянуть на реализацию
> TThread.AfterConstruction
> ?
Сорри, согласен. Хотя помнится мне, что в 5 версии дельфи(билдера) это было не так реализовано, то есть запуск приосходил сразу после вызова базового конструктора.... Потому и сказал так. http://qc.borland.com/wc/qcmain.aspx?d=6137- это поискал, ибо 5 дельфи уже нет у меня.
Loginov Dmitry (2007-06-06 13:57:00) [3]А если глянуть на реализацию
TThread.AfterConstruction
?
Evgeny V (2007-06-06 13:50:00) [4]
> Loginov Dmitry © (06.06.07 13:39) [15]
Нет не верю, так как поток у него создан и запущен сразу Create(Suspended:=false), а это уже классика, описанная много где, никто не гарантирует, что до выполнения команды А, поток не будет остановлен и не будет передано управление другому потоку для выполнения команды B.... Может 100 раз выполнится нормально, а на 101 сразу запустит поток на выполнение
Loginov Dmitry (2007-06-06 13:39:00) [5]> никто не гарантирует, что выполнение Execute не начнется
> раньше, чем например выполниться в конструкторе
Я гарантирую. Теперь веришь? )))
Evgeny V (2007-06-06 13:11:00) [6]Совет - не использовать 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;
Что может привести к проблемам....
Kolan (2007-06-05 22:02:00) [7]Тема актуальна, но отвечу завтра :)
Loginov Dmitry (2007-06-05 17:00:00) [8]Так понял, ты создаешь еще несколько вспомагательных потоков (иначе к чему создание критической секции в конструкторе). Нет ли у этих потоков какой-либо искусственной задержки в методе Execute?
Сергей М. (2007-06-05 16:53:00) [9]
> Kolan © (05.06.07 16:35) [5]
Контроль и протоколирование непредвиденных исключений в теле Execute тобой организован ?
Kolan (2007-06-05 16:43:00) [10]> эээ немного не это имел ввиду, имел ввиду участок кода,
> где
> TPackageExtractor.Create() вызывается
constructor TConnectionManager.Create;
begin
///
FPackageExtractor := TPackageExtractor.Create(StartByte, EndByte);
FPackageExtractor.PackageReceivedEvent := PackageReceivedEvent;
///
end;
может лог косячит?
Нет ошибка есть реально. Обмнен прекрашается с устройством это все у меня на глазах.
Kolan (2007-06-05 16:41:00) [11]Вот когда все ок:
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}.
Что он делает почти две секунды непонятно.
Eraser (2007-06-05 16:41:00) [12]> [7] Kolan © (05.06.07 16:38)
эээ.. немного не это имел ввиду, имел ввиду участок кода, где
TPackageExtractor.Create() вызывается...
может лог косячит?
Kolan (2007-06-05 16:38:00) [13]> глянуть бы код создания потока.
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:36:00) [14]> Kolan ©
глянуть бы код создания потока.
Kolan (2007-06-05 16:35:00) [15]> while not Terminated do
Дык яж говорю на тысячу операцийодин раз облом. А в каждой операциициклwhile not Terminated doпрокручивается 29(примеро) раз. Итого 29000раз. Сами понимаете просто F9 не понажимаешь :(
Сергей М. (2007-06-05 16:30:00) [16]
> отладчиком не пройдешь тк незнаю как попасть на проблемму
Ставь брейкпойнт наwhile not Terminated doи лови, в чем проблема-то ?
Kolan (2007-06-05 16:22:00) [17]> А что говорит отладчик ?
Да отладчиком не пройдешь тк незнаю как попасть на проблемму. Из 1000 раз нормальной работы 1 раз ж*па, поэтму лог все что есть для отладки
Сергей М. (2007-06-05 16:19:00) [18]А что говорит отладчик ?
Kolan (2007-06-05 16:14:00) [19]По логу видно что Resume отрабатывает. А до
while not Terminated doдело не доходит почему так может быть?
ЗЫ
Сор, первый пост случайно нажал «отправить».