Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпается
- Код? от Der Meister, 24 апреля 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();
Не факт.
Из того, что когда Вы закрываете программу Вы должны, сначала закрыть потоки, а потом программу. Иначе поток остался открытым и живет своей жизнью.
Здесь всю работу закрытия потока берет на себя Visual Studio.
Не понятно это а при последующих опять - можно в деталях.
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 файл не работает - один из потоков не просыпается
_handlerEvent.Abort();// "ЭТО завершает поток из другого потока
}
_handlerEvent.Join(500); // "500 Timeout для закрытия
}
А если так:
_handlerEvent.Join(500); // "500 Timeout для закрытия
}
не вижу смысла четно говоря, потому что метод отрабатывает только при закрытии приложения, и отрабатывает нормально в обоих случаях (при запуске через студию и при запуске через ехе файл)
ну и на всякий случай - а событие, по которому поток должен просыпаться - оно появляется в очереди? Может проблема в этом?
да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.
да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.
Еще раз - "не вижу проблемы" - или все же "объект в очереди достоверно появляется, но поток не просыпается"?
Это как бы разные вещи. Если в одних случаях все отрабатывает нормально - то вероятно проблема не в потоке.
На ура не прошло, но все же думаю поток после закрытия жив.
Я тоже об этом думал почему работает на других компах.
Хорошо Вы писали, что 5 компа, а есть комп на котором прога работает всего.
Если да посмотрите какой framework в плане Eng or RUS и версия. У меня была проблема c DE framework .
Да еще при создании проекта какой framework изпользывали по умолчанию вот это ВАЖНО.
да при появлении в очереди объектов, просыпается поток на запись. Ну в этом проблемы не вижу, потому что при запуске через студию норм же работает и на некоторых компах даже через ехе файл работает. мистика блин какая-то.
Еще раз - "не вижу проблемы" - или все же "объект в очереди достоверно появляется, но поток не просыпается"?
Это как бы разные вещи. Если в одних случаях все отрабатывает нормально - то вероятно проблема не в потоке.
в очереди появляется объект
На ура не прошло, но все же думаю поток после закрытия жив.
Я тоже об этом думал почему работает на других компах.
Хорошо Вы писали, что 5 компа, а есть комп на котором прога работает всего.
Если да посмотрите какой framework в плане Eng or RUS и версия. У меня была проблема c DE framework .
Да еще при создании проекта какой framework изпользывали по умолчанию вот это ВАЖНО.
FW 4 дефолтный. стесняюсь спросить ... а как посмотреть FW ru или en
Честно сказать не знаю.(мой косяк)
Сам использую только en. Так вот когда заменил de на en и беда стала не бедой.