-
Перехожу на .NET и столкнулся с проблемой обмена данными между потоками. В Win32 это можно было сделать с помощью асинхронной посылки сообщения PostThreadMessage, а вот в .NET теперь небольшой облом. И придумать пока не могу, что б предпринять. Кто чем может поможет, подскажет, какие способы и варианты имеются? Работаю с Framework 2.0. Заранее, спасибо.
-
-
Т.е. только через делегаты? Честного говоря, час почитав сишные примеры - нифига пока не понял как они работают. :(
-
> boa_kaa © (22.01.08 22:40) [1]
Это не в ту степь.
> Patriotus81 © (22.01.08 22:07) > И придумать пока не могу, что б предпринять
Реализуй свою очередь.
-
> Patriotus81 © (23.01.08 10:10) [2] > > Т.е. только через делегаты?
нет не только. > boa_kaa © (22.01.08 22:40) [1]
это всего лишь повод задуматься. Эта тема обсосана уже так, что остается только воспользоваться элементарным поиском. Вот ресурсик, там очень много дотнетовских статей. http://www.codeproject.com/
-
А чего там обсасывать-то?
System.Collections.Queue в руки.
-
Спасибо за информацию, по-тиху начинает, что-то проясняться, но всё равно пока тупик. Начал по-тиху писать маленькую программку с потоком и всё равно куча вопросов как ему назначить очередь, как отослать в очередь данные и т.д. Вообщем очень хотелось бы простейший пример, где например содаётся поток который ждёт данные от другого потока. Если, несложно, конечно.
-
> Patriotus81 © (23.01.08 17:27) [6]
по моей ссылке, если поискать, есть именно такой пример. Вчера случайно наткнулся, сейчас искать лень
-
> [6] Patriotus81 © (23.01.08 17:27)
Queue + объект синхронизации типа ManualResetEvent ставишь сообщение в очередь, генеришь событие ev.Set в принимающем потоке while() { ev.WaitOne; // попали сюда - есть сообщение в Queue }
-
Эх, логика то понятна, но тяжко реализовать, не зная кода. Но всё равно спасибо за помощь. Буду реализовывать, эксперементировать. ;)
-
> но тяжко реализовать, не зная кода
Не зная какого кода?! Этот код тебе надо написать самому. Все базовые классы уже есть в стандартной библиотеке.
-
Ага. Но я книженцию уже нашёл, так что теперь
-
... легче
-
Народ, ещё такой вопрос! В Win32 послав сообщение потоку, он его обрабатывал и слал ответ главному потоку. Последнее происходило по принципу - передача сообщения для Handle формы, поймав которое она и обрабатывала, тем самым не блокирую главные поток во час ожидания. Как теперь похожий механизм организовать в .NET ? сообщений то нет, а останавливать гланый поток нельзя.
-
Если уж в главном потоке есть формы, то подходящим вариантом будет использование ISynchronizeInvoke.
-
Оки, спасиб, за подсказку. щас попробую разобраться.
-
пока что-то никак. Поток есть, с даннымі работает. Но вот как этот результат передать главному потоку. Пробую пока с делегатами разобраться(с тем что более менее знаю). Т.е. мне надо из дополнительного потока создать некое собвтие которое возбудит метод из главного потока с передачей ему параметров и т.д. Не получается пока... :(
-
очень хотелось бы пример
-
-
> вот тут примерчик какойто естьhttp://msdn2.microsoft.com/en- > us/library/ms993020.aspx
Вот как раз по этому примеру и делал. В нём используются делегаты, точнее два делегата. Один вызывается из основного потока и предеаёт данные в рабочий, а другой вызывается из рабочего потока и передаёт данные в основной. Вроде всё прозрачно и гладко. Но я то пишу на Delphi .NET . Перевожу из этого примера написанного на C# себе. В документации по Делфе прочёл что делегаты можно использовать только через Reflection. Всё нормально, но я не могу в делегаты передать параметры как там в C#. Делфі начінает ругаться тіпа Unsafe code only allowed in unsafe procedure. Народ, подскажите, в Делфи .NET возможно вообще с помошью делегатов отправлять данные в потоки? Через ISynchronizeInvoke пока так и не понял.
-
Вообщем при использовании делегатов, когда осуществляю уже операцию из рабочего потока присвоение c.OnDo2 := @hc.WhatToDo2(a); {c.OnDo2 - делегат с параметром(a:integer) hc.WhatToDo2(a) - метод, который должен выполнится в UI-потоке}
компилятор выдаёт ошибку - Unsafe code only allowed in unsafe procedure. если помечаю эту процедурц как unsafe, опять ругается компилятор, что a - долдна быть переменной(она ведь у меня и является песременной локальной).
Вообщем, что-то вообще запуталси.
-
WindowsFormsSynchronizationContext ?
-
Удалено модератором
|