Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Доступ к "объекту" из другого потока, ньюансы / 17 сообщений из 17, страница 1 из 1
12.04.2015, 06:54
    #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
12.04.2015, 07:37
    #38934042
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к "объекту" из другого потока, ньюансы
Зависит о любимого тобою winapi

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

обзор здесь
https://msdn.microsoft.com/ru-ru/library/zdzx8wx8(v=vs.110).aspx
...
Рейтинг: 0 / 0
13.04.2015, 20:26
    #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
13.04.2015, 20:31
    #38935298
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к "объекту" из другого потока, ньюансы
Дмитрий77Чет я сомневаюсь что attach можно удалять сразу после .SendAsync
угу, ответ - в соседнем топике
...
Рейтинг: 0 / 0
17.04.2015, 20:56
    #38939666
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к "объекту" из другого потока, ньюансы
pationне два потока одновременно использую один коннекшн! попробуй сделать ради интереса, посмотри что выйдет
Фигня похоже вышла.
На "единичных" тестах все работало, хотя пару раз возникали сомнения.
Счас вроде дописал этот модуль, на 5 одновременных вызовах начинает твориться непойми чего, подозреваю из-за этого.
Ничего не вылетает, благо Try...Catch на любые запросы к БД напичкано от души, но путаница полная.
При этом приложение походу еще и не всегда закрывается как положено. Предполагаю, подвисание обработки очередного message из-за connection и как следствие не выход на цикл где ReadFile+MAILSLOT_WAIT_FOREVER должен вернуть ошибку и закрыть поток.

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

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

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

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


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