Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 раз ж*па, поэтму лог — все что есть для отладки&#133


 
Сергей М. ©   (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]

> эээ&#133 немного не это имел ввиду, имел ввиду участок кода,
> где
> TPackageExtractor.Create() вызывается&#133


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.037 c
2-1184854845
Avokain
2007-07-19 18:20
2007.08.12
Числа вида 1,000,000


2-1184235621
Kolan
2007-07-12 14:20
2007.08.12
Помогите разобраться с компоненктами для доступа к базам&#133


3-1176383248
ZevSS
2007-04-12 17:07
2007.08.12
Репликация БД и глобальный поиск


15-1184260431
Alarm
2007-07-12 21:13
2007.08.12
Посьба к app


15-1184534328
Аффтар
2007-07-16 01:18
2007.08.12
Скачать *.avi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский