Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпается

87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
Вообщем обнаружилась такая проблема: есть приложение на С#, FW 4.0. При старте создается несколько потоков, после чего они приостанавливаются (...WaitOne(). По событию они должны проснуться... и тут начинается "непонятное". Если проект запущен из студии (с перекомпиляцией), то все работает отлично, потоки просыпаются. Но если сразу после этого запустить приложение просто через *.exe файл (Bin/Debag) , то один из потоков наотрез отказывается просыпаться. Такая "фигня" происходит на 3х ПК из 5ти. Если перезагрузить ПК, то приложение при первом запуске (речь о запуске через *.exe файл) отрабатывает нормально, а при последующих опять не просыпается один поток. FW переустанавливал, студию тоже... не знаю в чем может быть проблема. Рад буду выслушать ваши мнения и советы.
  • Код? от Der Meister, 24 апреля 2013 года
87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
схематично код выглядит как то так
При запуске:
создаем потоки

класс 1:
private AutoResetEvent _autoEvent;
....
в конструкторе класс 1
_autoEvent=new AutoResetEvent(false);


класс 2
private AutoResetEvent _autoEvent;
...
в конструкторе класс 2
_autoEvent=new AutoResetEvent(false);

затем потоки приостанавливаются
_autoEvent.Reset();
_autoEvent.WaitOne();

при появлении события (а конкретнее, в очереди появляется объект для записи в БД)

будим потоки

сперва в классе 1
_autoEvent.Set();

затем в классе 2
_autoEvent.Set();
327
24 апреля 2013 года
UserNet2008
748 / / 03.04.2010
Цитата:
Такая "фигня" происходит на 3х ПК из 5ти


Не факт.
Из того, что когда Вы закрываете программу Вы должны, сначала закрыть потоки, а потом программу. Иначе поток остался открытым и живет своей жизнью.

Цитата:
Если проект запущен из студии (с перекомпиляцией), то все работает отлично


Здесь всю работу закрытия потока берет на себя Visual Studio.

Цитата:
Если перезагрузить ПК, то приложение при первом запуске (речь о запуске через *.exe файл) отрабатывает нормально, а при последующих опять не просыпается один поток.


Не понятно это а при последующих опять - можно в деталях.

87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
Цитата:
Из того, что когда Вы закрываете программу Вы должны, сначала закрыть потоки, а потом программу. Иначе поток остался открытым и живет своей жизнью.


1. потоки фоновые _writeThread = new Thread(WriterDbEvent) { IsBackground = true };
2. В каждом классе при закрытии программы предусмотрены методы наподобие:
public void Dispose() {
_state = false;
_disposed = true;
_listActiveAlarm = null;
if (_handlerEvent.ThreadState!=ThreadState.Aborted) {
_handlerEvent.Abort();
}
_handlerEvent = null;
_queueFreedomAlarmDb = null;
_inQueue = null;
_loge = null;
}
потоки 100% закрываются, при работе через студию и при работе через exe файл (проверял включая в код логи)

Цитата:
Не понятно это а при последующих опять - можно в деталях.


1. перезагрузил комп, запускаю через *exe файл - о чудо! работает
2. закрываю программу.
3. снова запускаю через *exe файл не работает - один из потоков не просыпается

327
24 апреля 2013 года
UserNet2008
748 / / 03.04.2010
Теперь понятно.

 
Код:
if (_handlerEvent.ThreadState!=ThreadState.Aborted) {
_handlerEvent.Abort();// "ЭТО завершает поток из другого потока
}
А если так:

 
Код:
if (_handlerEvent.ThreadState!=ThreadState.Aborted) {
_handlerEvent.Join(500); // "500 Timeout для закрытия
}
см.
1
24 апреля 2013 года
kot_
7.3K / / 20.01.2000
ну и на всякий случай - а событие, по которому поток должен просыпаться - оно появляется в очереди? Может проблема в этом?
87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
Цитата: UserNet2008

А если так:

 
Код:
if (_handlerEvent.ThreadState!=ThreadState.Aborted) {
_handlerEvent.Join(500); // "500 Timeout для закрытия
}
см.



не вижу смысла четно говоря, потому что метод отрабатывает только при закрытии приложения, и отрабатывает нормально в обоих случаях (при запуске через студию и при запуске через ехе файл)

Цитата:

ну и на всякий случай - а событие, по которому поток должен просыпаться - оно появляется в очереди? Может проблема в этом?



да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.

1
24 апреля 2013 года
kot_
7.3K / / 20.01.2000
Цитата: Avol

да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.


Еще раз - "не вижу проблемы" - или все же "объект в очереди достоверно появляется, но поток не просыпается"?
Это как бы разные вещи. Если в одних случаях все отрабатывает нормально - то вероятно проблема не в потоке.

327
24 апреля 2013 года
UserNet2008
748 / / 03.04.2010
Цитата:
мистика блин какая-то.


На ура не прошло, но все же думаю поток после закрытия жив.
Я тоже об этом думал почему работает на других компах.
Хорошо Вы писали, что 5 компа, а есть комп на котором прога работает всего.
Если да посмотрите какой framework в плане Eng or RUS и версия. У меня была проблема c DE framework .

Да еще при создании проекта какой framework изпользывали по умолчанию вот это ВАЖНО.

87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
Цитата: kot_
Цитата: Avol

да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.


Еще раз - "не вижу проблемы" - или все же "объект в очереди достоверно появляется, но поток не просыпается"?
Это как бы разные вещи. Если в одних случаях все отрабатывает нормально - то вероятно проблема не в потоке.



в очереди появляется объект

87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
Цитата: UserNet2008
Цитата:
мистика блин какая-то.


На ура не прошло, но все же думаю поток после закрытия жив.
Я тоже об этом думал почему работает на других компах.
Хорошо Вы писали, что 5 компа, а есть комп на котором прога работает всего.
Если да посмотрите какой framework в плане Eng or RUS и версия. У меня была проблема c DE framework .

Да еще при создании проекта какой framework изпользывали по умолчанию вот это ВАЖНО.



FW 4 дефолтный. стесняюсь спросить ... а как посмотреть FW ru или en

327
24 апреля 2013 года
UserNet2008
748 / / 03.04.2010
Цитата:
FW 4 дефолтный. стесняюсь спросить ... а как посмотреть FW ru или en


Честно сказать не знаю.(мой косяк)
Сам использую только en. Так вот когда заменил de на en и беда стала не бедой.

87K
24 апреля 2013 года
Avol
7 / / 24.04.2013
тема закрыта, проблема решена. Ошибка в коде: не в том месте "взводился" разрешающий флажок для одного из потоков. А мистика в работе объяснялась быстродействие: на более медленных тачках, пока просыпался первый поток, "флажок для второго успевал взвестись. всем спасибо за участие.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог