powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Доступ к "объекту" из другого потока, ньюансы
17 сообщений из 17, страница 1 из 1
Доступ к "объекту" из другого потока, ньюансы
    #38934039
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот если например у меня Form1, созданная
Код: vbnet
1.
2.
    Form1 = New frm1
    Application.Run(Form1)


и я создаю поток
Код: vbnet
1.
2.
      MailSlotThread = New Thread(New ThreadStart(AddressOf MyThreadFunction))
      MailSlotThread.Start()


то я не могу напрямую из MyThreadFunction что-то сделать с элементами этой формы,
надо извращаться
Код: vbnet
1.
    Form1.Invoke(New MyFunctionDelegate(AddressOf MyFunction), parameter)


(обсуждали)

Ой как доставляет.

===
А вот если у меня к примеру из основного потока создается
Код: vbnet
1.
2.
3.
  Sub Main()
    adoConn = New ADODB.Connection
    adoConn.Open("Provider=



то я очень даже могу из MyThreadFunction успешно ковырять БД:
Код: vbnet
1.
2.
          adoConn.BeginTrans()
          adoConn.Execute("INSERT INTO ...



Радует.
===
И от чего это зависит?
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934042
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит о любимого тобою winapi

В случаее окон - работать можно только из создавшего потока

С COM - смотри документацию на каждый конкретно в части касающейся многопоточности
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934044
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

понятно.
Плохо понимаю какую там докуменацию по adodb я должен читать, и надо ли мне оно.
Но в любом случае метод тыка мне в помощь.
Что поток с БД работает уже неплохо.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934048
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

потоки же работают в 1 адресном пространстве, по этому 2 потока могут работать с 1 объектом без проблем, но существуют подводные айсберги, нужна синхронизация работы потоков, чтоб не получилось, что в 1 момент времени у тебя 2 потока пытаются сделать, что то противоречивое друг другу.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934050
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

>нужна синхронизация работы потоков,
ну тот поток который у меня mailslot ловит закрывается аккуратно, обсуждали как-то
м.б. захочу еще добавить пару-тройку, но надо смотреть по ходу
вполне вероятно ограничусь таймерами (c mailslot поток по крайней мере оправдан, ловит сообщения от быстро меняющегося процесса что влияет на отображение реального состояния дел, а например отправить мыло - задержка в 1-2 сек не принципиальна, пока там таймер сообразит что это надо сделать).

>чтоб не получилось, что в 1 момент времени у тебя 2 потока пытаются сделать, что то противоречивое друг другу
в смысле типа два потока одну и ту же запись в БД пытаются изменить?
вроде как исключено логикой программы
Но если что не так, то на динамических тестах быстро вылетит.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934052
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77и надо ли мне оно.
как наступишь на грабли - приходи
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934735
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>чтоб не получилось, что в 1 момент времени у тебя 2 потока пытаются сделать, что то противоречивое друг другу
в смысле типа два потока одну и ту же запись в БД пытаются изменить?
вроде как исключено логикой программы
Но если что не так, то на динамических тестах быстро вылетит.

не два потока одновременно использую один коннекшн! попробуй сделать ради интереса, посмотри что выйдет
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38934835
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationне два потока одновременно использую один коннекшн! попробуй сделать ради интереса, посмотри что выйдет
в смысле должно вылететь или не знаешь и интересно что выйдет?

Ну смотри. Пока есть вот что.
Отдельный поток который ловит mailslot пишет в базу статистику входящих тел. вызовов (по мере необходимости, без долбежа).
Грубо вызов закончился, пишется в отдельную таблицу команду отправить мыло.

Таймер (на основной Form1 созданной из main()) смотрит не надо ли отправить мыло - раз в секунду запрашивает базу.
Мыльную процедуру пока не добавил(как раз ей сейчас занимаюсь, не проблема), ну просто msgbox выводится, суть что он ее долбит из другого потока (через тот же connection).

На отдельных тестах ничего не вылетает (по 50 одновременных вызовов протестировать естественно смогу лишь когда допишу всю логику).

Ну попробовал интервал mail-таймера для теста уменьшить до 1мс (вместо 1000). Ничего не вылетело, работа mailslot не нарушилась.

Подозреваю что и не вылетит. Скорее всего какая-то очередь существует.

Ну, в крайнем случае сделаю я этот Invoke и будет он ее долбить из одного потока (как в VB6 успешно работало, там mailslot сидел на таймере, а не на бесконечном ожидании в своем потоке).

Кстати вопрос, возможно глупый но тем не менее.
Таймер в .Net -это отдельный поток? Я обратил внимание что он работает не совсем так как в VB6.
Попробую объяснить. Напр. я таймером вывожу MsgBox. VB6 больше одного не выведет. А .Net будет генерить по MsgBox с каждым тиком.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38935108
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Таймер в .Net -это отдельный поток?
Какой именно таймер?
их несколько разновидностей
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38935189
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

тот который я в конструкторе на форму кидаю.

Глянь еще соседнюю тему, а то я себя похоже заранее накрутил.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38935280
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77тот который я в конструкторе на форму кидаю.
это WM_TIMER со всеми вытекающими

обзор здесь
https://msdn.microsoft.com/ru-ru/library/zdzx8wx8(v=vs.110).aspx
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38935296
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилэто WM_TIMER со всеми вытекающими
Ну понятно. Значит в окно стучится. Это объясняет "генерацию множественных MsgBox-ов".
Если сделать Thread.Sleep(10000) в процедуре таймера, то все стопорится (в том числе и работа "других таймеров"),
в принципе итак было ясно что поток тот же.

В таком случае в процедуре таймера ( 17509232 )
.Send(message) делать нельзя
только
.SendAsync(message, m_emailToken)
Ну, по идее в m_emailToken как раз можно запихнуть информацию об attach, которые удалить из CallBack-функции.
Чет я сомневаюсь что attach можно удалять сразу после .SendAsync

CDO.Message в этом плане конечно удобнее, оно не стопорит поток.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38935298
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Чет я сомневаюсь что attach можно удалять сразу после .SendAsync
угу, ответ - в соседнем топике
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38939666
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationне два потока одновременно использую один коннекшн! попробуй сделать ради интереса, посмотри что выйдет
Фигня похоже вышла.
На "единичных" тестах все работало, хотя пару раз возникали сомнения.
Счас вроде дописал этот модуль, на 5 одновременных вызовах начинает твориться непойми чего, подозреваю из-за этого.
Ничего не вылетает, благо Try...Catch на любые запросы к БД напичкано от души, но путаница полная.
При этом приложение походу еще и не всегда закрывается как положено. Предполагаю, подвисание обработки очередного message из-за connection и как следствие не выход на цикл где ReadFile+MAILSLOT_WAIT_FOREVER должен вернуть ошибку и закрыть поток.

По ощущениям, проблемы возникакают тогда когда оба потока работают с одной и той же таблицей,
пример с тестом с миллисекундным таймером, который занимается отправкой мыла видимо был неудачен.

Буду разбираться, видимо передавать обработку mailslot-сообщений в основной поток.
Если это не поможет, убирать нафиг этот поток и сажать mailslot на таймер как и было в VB6.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38939805
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Invoke в основной поток (чтоб только оттуда пользовать Connection) конечно помог.
Но в итоге таки пересадил mailslot на таймер формы в основной поток (как и было). Причина: задержка в закрытии приложения по команде извне, потоку надо время чтоб закрыться, пусть малое но при моем алгоритме перезапуска "системы" достаточное для того чтобы приложение не перезапустилось (т.е. "система" при запуске видит закрывающийся "хвост" еще не закрывшегося приложения и не перезапускает его. Дефекты алгоритма конечно, но проще оставить с таймером как было, ну его нафик этот поток в данном случае.
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38939881
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Изопропил,

понятно.
Плохо понимаю какую там докуменацию по adodb я должен читать, и надо ли мне оно.
Не надо забивать голову ненужными вещами
...
Рейтинг: 0 / 0
Доступ к "объекту" из другого потока, ньюансы
    #38939887
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

в смысле?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Доступ к "объекту" из другого потока, ньюансы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]