Конференция ".Net" » Обмен данными между потоками в .NET(Framework2) [D2005, WinXP]
 
  • Patriotus81 © (22.01.08 22:07) [0]
    Перехожу на .NET и столкнулся с проблемой обмена данными между потоками. В Win32 это можно было сделать с помощью асинхронной посылки сообщения PostThreadMessage, а вот в .NET теперь небольшой облом. И придумать пока не могу, что б предпринять. Кто чем может поможет, подскажет, какие способы и варианты имеются? Работаю с Framework 2.0. Заранее, спасибо.
  • boa_kaa © (22.01.08 22:40) [1]
  • Patriotus81 © (23.01.08 10:10) [2]
    Т.е. только через делегаты?
    Честного говоря, час почитав сишные примеры - нифига пока не понял как они работают. :(
  • DiamondShark © (23.01.08 11:55) [3]

    > boa_kaa ©   (22.01.08 22:40) [1]

    Это не в ту степь.


    > Patriotus81 ©   (22.01.08 22:07)  
    > И придумать пока не могу, что б предпринять

    Реализуй свою очередь.
  • boa_kaa © (23.01.08 13:18) [4]

    > Patriotus81 ©   (23.01.08 10:10) [2]
    >
    > Т.е. только через делегаты?

    нет не только.

    > boa_kaa ©   (22.01.08 22:40) [1]

    это всего лишь повод задуматься. Эта тема обсосана уже так, что остается только воспользоваться элементарным поиском.

    Вот ресурсик, там очень много дотнетовских статей.
    http://www.codeproject.com/
  • DiamondShark © (23.01.08 13:57) [5]
    А чего там обсасывать-то?

    System.Collections.Queue в руки.
  • Patriotus81 © (23.01.08 17:27) [6]
    Спасибо за информацию, по-тиху начинает, что-то проясняться, но всё равно пока тупик. Начал по-тиху писать маленькую программку с потоком и всё равно куча вопросов как ему назначить очередь, как отослать в очередь данные и т.д. Вообщем очень хотелось бы простейший пример, где например содаётся поток который ждёт данные от другого потока. Если, несложно, конечно.
  • boa_kaa © (23.01.08 17:44) [7]

    > Patriotus81 ©   (23.01.08 17:27) [6]

    по моей ссылке, если поискать, есть именно такой пример. Вчера случайно наткнулся, сейчас искать лень
  • clickmaker © (23.01.08 18:18) [8]

    > [6] Patriotus81 ©   (23.01.08 17:27)

    Queue + объект синхронизации типа ManualResetEvent
    ставишь сообщение в очередь, генеришь событие ev.Set
    в принимающем потоке
    while()
    {
     ev.WaitOne;
     // попали сюда - есть сообщение в Queue
    }
  • Patriotus81 © (24.01.08 09:02) [9]
    Эх, логика то понятна, но тяжко реализовать, не зная кода. Но всё равно спасибо за помощь. Буду реализовывать, эксперементировать. ;)
  • DiamondShark © (24.01.08 11:40) [10]

    > но тяжко реализовать, не зная кода

    Не зная какого кода?!
    Этот код тебе надо написать самому. Все базовые классы уже есть в стандартной библиотеке.
  • Patriotus81 © (24.01.08 14:38) [11]
    Ага. Но я книженцию уже нашёл, так что теперь
  • Patriotus81 © (24.01.08 14:39) [12]
    ... легче
  • Patriotus81 © (25.01.08 11:26) [13]
    Народ, ещё такой вопрос! В Win32 послав сообщение потоку, он его обрабатывал и слал ответ главному потоку. Последнее происходило по принципу - передача сообщения для Handle формы, поймав которое она и обрабатывала, тем самым не блокирую главные поток во час ожидания.
    Как теперь похожий механизм организовать в .NET ?  сообщений то нет, а останавливать гланый поток нельзя.
  • DiamondShark © (25.01.08 11:34) [14]
    Если уж в главном потоке есть формы, то подходящим вариантом будет использование ISynchronizeInvoke.
  • Patriotus81 © (25.01.08 11:45) [15]
    Оки, спасиб, за подсказку. щас попробую разобраться.
  • Patriotus81 © (27.01.08 16:31) [16]
    пока что-то никак. Поток есть, с даннымі работает. Но вот как этот результат передать главному потоку. Пробую пока с делегатами разобраться(с тем что более менее знаю). Т.е. мне надо из дополнительного потока создать некое собвтие которое возбудит метод из главного потока с передачей ему параметров и т.д.  
    Не получается пока... :(
  • Patriotus81 © (27.01.08 16:52) [17]
    очень хотелось бы пример
  • b z (27.01.08 16:59) [18]

    > очень хотелось бы пример

    вот тут примерчик какойто есть
    http://msdn2.microsoft.com/en-us/library/ms993020.aspx
  • Patriotus81 © (27.01.08 20:20) [19]

    > вот тут примерчик какойто естьhttp://msdn2.microsoft.com/en-
    > us/library/ms993020.aspx

    Вот как раз по этому примеру и делал. В нём используются делегаты, точнее два делегата. Один вызывается из основного потока и предеаёт данные в рабочий, а другой вызывается из рабочего потока и передаёт данные в основной. Вроде всё прозрачно и гладко.
    Но я то пишу на Delphi .NET . Перевожу из этого примера написанного на C# себе. В документации по Делфе прочёл что делегаты можно использовать только через Reflection. Всё нормально, но  я не могу в делегаты передать параметры как там в C#. Делфі начінает ругаться тіпа Unsafe code only allowed in unsafe procedure.
    Народ, подскажите, в Делфи .NET возможно вообще с помошью делегатов отправлять данные в потоки?
    Через ISynchronizeInvoke пока так и не понял.
  • Patriotus81 © (28.01.08 11:09) [20]
    Вообщем при использовании делегатов, когда осуществляю уже операцию из рабочего потока
    присвоение
    c.OnDo2 := @hc.WhatToDo2(a); {c.OnDo2 - делегат с параметром(a:integer)
                                               hc.WhatToDo2(a) - метод, который должен   выполнится в UI-потоке}

    компилятор выдаёт ошибку - Unsafe code only allowed in unsafe procedure.
    если помечаю эту процедурц как unsafe, опять ругается компилятор, что a - долдна быть переменной(она ведь у меня и является песременной локальной).

    Вообщем, что-то вообще запуталси.
  • isasa © (26.02.08 15:09) [21]
    WindowsFormsSynchronizationContext ?
  • имя (06.07.09 04:54) [22]
    Удалено модератором
 
Конференция ".Net" » Обмен данными между потоками в .NET(Framework2) [D2005, WinXP]
Есть новые Нет новых   [118232   +40][b:0][p:0.001]