|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Вообщем обнаружилась такая проблема: есть приложение на С#, FW 4.0. При старте создается несколько потоков, после чего они приостанавливаются (...WaitOne(). По событию они должны проснуться... и тут начинается "непонятное". Если проект запущен из студии (с перекомпиляцией), то все работает отлично, потоки просыпаются. Но если сразу после этого запустить приложение просто через *.exe файл (Bin/Debag) , то один из потоков наотрез отказывается просыпаться. Такая "фигня" происходит на 3х ПК из 5ти. Если перезагрузить ПК, то приложение при первом запуске (речь о запуске через *.exe файл) отрабатывает нормально, а при последующих опять не просыпается один поток. FW переустанавливал, студию тоже... не знаю в чем может быть проблема. Рад буду выслушать ваши мнения и советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 07:26 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Ошибки в коде являются наиболее вероятной причиной ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 08:18 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Так ведь дело в том что при запуске проекта из студии -все отлично работает, а при запуске из Bin/Debag проблема с потоком. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 08:28 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
схематично код выглядит как то так При запуске: создаем потоки класс 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(); ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 08:52 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
MSDN говорит следующее Нет никакой гарантии, что каждый вызов метода Set освободит поток. Если два вызова находятся настолько близко, что второй вызов происходит до освобождения потока, тогда освобождается только один поток. Это как, если бы второй вызов не произошел. Также, если Set вызывается, когда нет ожидающих потоков и AutoResetEvent получает сигналы, сигнал никакого влияния ни на что не оказывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 09:13 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
да, натыкался на это... но это выглядело бы правдоподобно если бы: 1. то работало то не работало - а тут на 1 ПК никогда не работает, на другом Всегда работает. 2. если бы приложение вело себя одинаково при запуске через студию и при запуске через *exe файл ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 09:47 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Советую вам собрать простенькое приложение с подобной схемой потоков ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 09:51 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Avolno1. то работало то не работало - а тут на 1 ПК никогда не работает, на другом Всегда работает. 2. если бы приложение вело себя одинаково при запуске через студию и при запуске через *exe файл как раз в этом ничего удивительного. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 10:07 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Исходите из того, что какой-то поток занимает процессор, потому что AutoResetEvent строит строгую очередь из потоков. Кроме того, если ни один поток не ожидает своей очереди, тогда вызов Set() бесполезен, прибывший поток будет ждать своего, нового, вызова. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 10:22 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Вы в коде вызываете Reset(). Reset() удаляет всю очередь, то есть потоки завершают работу и возвращаются обратно в пул, если таковой используете. Если же вы ждете события неопределенное время, тогда есть смысл вернуть потоки в пул, а затем позвать их обратно, а не продолжать работу с демонами. Если же вы ожидаете объект для работы с БД, тут вообще нужно абстрагироваться от логики приложения, используйте делегаты Action, Func, они для этого и придуманы. А тянуть поток через всю логику и прерывать его на каждый чих неразумно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 10:58 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
схема ваша не очень ясна. поток 1 ждет event1 - далее где находится evnet2? И кто его вызывает? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:02 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Avolno, Код выложи. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:08 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
WPF, пчоему? у меня была такая система. Поток 1 читал что-то из БД через некий интервал а затем клал в очередь и будил Поток2 и тд. Ни разу проблем с event-ами не наблюдал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:22 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
WPFВы в коде вызываете Reset(). Reset() удаляет всю очередь, то есть потоки завершают работу и возвращаются обратно в пул, если таковой используете. Если же вы ждете события неопределенное время, тогда есть смысл вернуть потоки в пул, а затем позвать их обратно, а не продолжать работу с демонами. Если же вы ожидаете объект для работы с БД, тут вообще нужно абстрагироваться от логики приложения, используйте делегаты Action, Func, они для этого и придуманы. А тянуть поток через всю логику и прерывать его на каждый чих неразумно. но разве это может объяснить разницу в работе через студию и через ехе файл ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:25 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Почему нельзя тянуть через все приложение, я так понял ваш вопрос? Зависит от многих факторов, по моему мнению, лучшее применение потоков – выполнение конкретной задачи. Этот вывод сделан на собственном опыте, документами из MSDN подкрепить не могу. Что происходит в противном случае, увеличивается вероятность ошибок, в том числе и ОС, ведь работая с потоками, вы работаете через Win API. Поэтому мое мнение однозначно укрепилось, что для работы с БД, нужны короткие как выстрел инструкции, что и обеспечивается надежно вышеупомянутыми делегатами. Все остальное имеет более низкую степень надежности. ИМХО ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:33 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Avolnoно разве это может объяснить разницу в работе через студию и через ехе файл Зачем вам искать ответ на вопрос, который не имеет никакого значения для работы приложения. Если интересно, почитайте, как устроена студия, вопросы исчезнут. Далее, когда работаете с потоками, все, что вы делаете, все должно иметь четкую логику. Возьмите бумагу и напишите, как и когда все будет работать, лучший способ избежать коллизий. Чудес не бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:36 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Avolnoда, натыкался на это... но это выглядело бы правдоподобно если бы: 1. то работало то не работало - а тут на 1 ПК никогда не работает, на другом Всегда работает. 2. если бы приложение вело себя одинаково при запуске через студию и при запуске через *exe файл Вы написали некорректный многопоточный код, вам просто везёт на одном из компов. PS. При работе с мнопогопоточностью надо помнить определение безумия по Эйнштейну: «Безумие - это проделывать то же самое снова и снова, каждый раз ожидая иного результата». ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:50 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
WPFПочему нельзя тянуть через все приложение, я так понял ваш вопрос? Зависит от многих факторов, по моему мнению, лучшее применение потоков – выполнение конкретной задачи. Этот вывод сделан на собственном опыте, документами из MSDN подкрепить не могу. Что происходит в противном случае, увеличивается вероятность ошибок, в том числе и ОС, ведь работая с потоками, вы работаете через Win API. Поэтому мое мнение однозначно укрепилось, что для работы с БД, нужны короткие как выстрел инструкции, что и обеспечивается надежно вышеупомянутыми делегатами. Все остальное имеет более низкую степень надежности. ИМХО вы имеет ввиду асинхронные операции (Begin.... End....)? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:51 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
mikola1982вы имеет ввиду асинхронные операции (Begin.... End....)?Разумеется, смысл на синглтоне использовать делегаты. Begin.... End.... это конечно более низкий уровень, вам же надо высунуть паблик методы наружу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:57 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
Здесь под другим ником я привожу пример такого доступа ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 12:03 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
ТС, боюсь без кода мы вам не поможем... ЗЫ так вы это для асинхрона используете? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 12:13 |
|
Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпа
|
|||
---|---|---|---|
#18+
тема закрыта, проблема решена. Ошибка в коде: не в том месте "взводился" разрешающий флажок для одного из потоков. А мистика в работе объяснялась быстродействие: на более медленных тачках, пока просыпался первый поток, "флажок для второго успевал взвестись. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 13:17 |
|
|
start [/forum/topic.php?fid=20&fpage=166&tid=1404800]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 304ms |
total: | 447ms |
0 / 0 |