![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
Random13 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Всем привет.
Ситуация следующая - есть прибор, посылающий непрерывно пакеты после команды старт. У него есть своя память, где они, в случае не успевания обработки, скапливаются. После комнды стоп генерация пакетов прекращается. сред догребает все и завершает работу. при приходе пакетов происхоит определенное рисование на форме. Сделано все вызовами Invoke() из срэда. Проблема вот в чем. Хотелось бы дать, при закрытии, среду некоторое время для догребания пакетов(опустошения буфера девайса) и коррекного выхода, в случае проблем сделать аборт. Проблема в том, что использовать Thread.Sleep() в главном среде не получается, так как Invoke(), вызывемый из среда обрабатывается, понятно в главном среде, а во время слипа он тормозится и сред девайса ждет окончание его выполнени то есть слип главновного среда торозит и сред девайса. Нужен либо Invoke(), который бы не ожидался вызывающим средом, либо слип, не прерывающий обработку ассинхронных вызовов. Что-то найти ничего не могу. Никто ничего не подскажет ? При дебогировании у среда девайса висит статус WaitSleepJoin. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 2 Всего: 92 |
А зачем вообще там нужен Thread.Sleep() ? Я правильно понимаю задачу: при закрытии формы поток должен закрываться не сразу, а выработать весь буфер? Так надо сделать просто сделать флаг (переменную типа bool), который будет сигнализировать потоку, что пора завершать работу. Если этот флаг установлен, то и к форме больше не обращаемся. А чтобы процесс не завершался до тех пор, пока поток не отработал до конца, то у потока должно быть выставлено свойство IsBackground = false PS: Или я что-то недопонимаю -- просто язык какой-то странный, чем-то похож на русский, но явно не он. Ух-ты.
Ух-ты ещё раз! ![]() -------------------- Да. Именно так. |
|||
|
||||
Random13 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Ты не совсем правильно понял. Булевая константа в среде есть - так постоенны почти все среды, закрывающиеся по условию. Проблема с главного среда сказать среду закончится, подождать некоторе время (дать ему закончится), потом проверить его состояние, если все еще жив - убить. Причем за ради этого городить таймер на форме тоже не хотелось бы...
Задача не такая простая... Проблема не сказать среду закончится, а проконтролировать из главного потока его корректное завершение. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 2 Всего: 92 |
А если попробовать Thread.Join с таймаутом?
Добавлено через 13 минут и 24 секунды При этом главный поток, конечно, всё равно уйдёт в ожидание, но в потоке устройства ты просто не делай больше Invoke, после того как пришла команда остановится, или вообще делай асинхронный вызов через BeginInvoke. Тогда рабочему потоку не нужно будет дожидаться пока главный проснётся. -------------------- Да. Именно так. |
|||
|
||||
Random13 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
хорошая функция, но не спасает. все равно поток девайся тоже виснет с главным потоком при ожидании этой функции.
уже и DynamicInvoke пробовал - он вообще не рисует нормально на форме. я и так переcтаю вызывать его после команды остановки, видимо подвисает на текущей комаде. BeginInvoke тоже не спасает - работает так же. Это сообщение отредактировал(а) Random13 - 3.6.2008, 13:07 |
|||
|
||||
amarenkov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Random13 , попробуй использовать WindowsFormsSynchronizationContext. У него есть методы Post и Send для синхронной и асинхронной отправки сообщений. Может тебе поможет.
|
|||
|
||||
Random13 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
с помощью WindowsFormsSynchronizationContext работает вроде бы, но перегружает систему. и при очередном обновлении формы в конце концев падает.
в общем надоело мне ве это - просто убиваю поток абортом и все. еще проблему создает загрузка, наверное. При работе приходит около 90 пакетов в секунду. Invoke(), BeginInvoke() работают без проблем - только вот блокируют, вызывающий их поток, при блокировке основного потока. Это сообщение отредактировал(а) Random13 - 3.6.2008, 17:35 |
|||
|
||||
-Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 8 Всего: 59 |
И ты 90 раз в секунду вызываешь Invoke (BeginInvoke) в котором делаешь отрисовку формы? Ты не привел код, но подозреваю что так. ИМХО не хорошо это, так часто рисовать. Лучше сделать буферизацию пакетов и рисовать сразу махом несколько изменений, например после 50 пакетов, а не по одному. А по поводу твоего вопроса, посмотри это http://msdn.microsoft.com/ru-ru/library/w9f75h7a(en-us).aspx Если не разберешься, пиши. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |