TThread.Suspend
Модератор: kdv
TThread.Suspend
Подлючаюсь к FB2 через FIBPlus в отдельном потоке.
Сделал возможность приостанавливать поток.
Не заметил чтобы что-то, при этом, глючило.
Может ли приостанавка/восстановление потока привести к ошибке в момент выполнения запросов и фетча данных?
Сделал возможность приостанавливать поток.
Не заметил чтобы что-то, при этом, глючило.
Может ли приостанавка/восстановление потока привести к ошибке в момент выполнения запросов и фетча данных?
что вы все....
в отдельном треде можно работать с коннектом, до тех пор пока только этот тред с коннектом и работает. Т.е. параллельное обращение из разных тредов к одному коннекту недопустимо. Собственно, все.
p.s. можно из разных тредов в одном коннекте, синхронизируя треды. но это будет не параллельное обращение к коннекту.
в отдельном треде можно работать с коннектом, до тех пор пока только этот тред с коннектом и работает. Т.е. параллельное обращение из разных тредов к одному коннекту недопустимо. Собственно, все.
p.s. можно из разных тредов в одном коннекте, синхронизируя треды. но это будет не параллельное обращение к коннекту.
Вопрос, как я понимаю, был в другом. Если чел стопорнёт поток, то, например, не отвалится ли коннект, не потеряются ли данные (если поток приостановлен во время фетча), или ещё какая-нибудь бяка...
Тут скорее помогут разработчики (и эксперименты!), особенно, если указать время, на которое приостанавливается поток.
Тут скорее помогут разработчики (и эксперименты!), особенно, если указать время, на которое приостанавливается поток.
Вы все правильно поняли. Мои экмперименты ни к чему не привели, точнее к ошибкам не привели.Slavik писал(а):Если чел стопорнёт поток, то, например, не отвалится ли коннект, не потеряются ли данные (если поток приостановлен во время фетча), или ещё какая-нибудь бяка...
1. перед запуском потока коннектился к базе
2. в потоке делал бесконечный цикл, в котором открывал запрос и фетчил данные
3. периодически делал Suspend/Resume
Поясните, что вы имеете ввиду под "помогут разработчики"?Slavik писал(а):Тут скорее помогут разработчики (и эксперименты!),
Здесь также не совсем понял.Slavik писал(а):особенно, если указать время, на которое приостанавливается поток.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Тут еще пригодились бы разработчики Windows. Конечно, не факт, что код Winsocks исполняется в пользовательском режиме, но если suspend застанет поток между посылкой пакета на сервер и уходом в ожидание ответа, лично я не берусь предсказать результаты.kdv писал(а):"разработчики сервера Firebird помогут".
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: TThread.Suspend
Может для личного спокойствия стоит пересмотреть алгоритм? Например, не грубо останавливать поток, а посылать ему сообщение с "просьбой" перестать фетчить данные.Sikambr писал(а):Может ли приостанавка/восстановление потока привести к ошибке в момент выполнения запросов и фетча данных?
Re: TThread.Suspend
или в потоке завести и поднимать флаг Stopped, и вместо прямой проверки флага Terminated проверять его через функцию:Slavik писал(а):не грубо останавливать поток, а посылать ему сообщение с "просьбой" перестать фетчить данные.
Код: Выделить всё
function TmyThread.IsTermitate: Boolean;
begin
while not Terminated and Stopped do
Sleep(1000);
Result := Terminated;
end;