Отслеживание Events

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Отслеживание Events

Сообщение ASD » 15.12.2008 (Пн) 14:28

Привет.
Такая проблема:
Как можно отследить и передать значения из Events?

Ситуация такая

Есть эвент:
Код: Выделить всё
Public Sub FileSearch( fname as string) Handle.....


End Sub


А есть функция
Код: Выделить всё
Function GetFiles(fname as string) as string
'Тут обращаемся к классу который после отработки генерит FileSearch эвент
clFiles.GetFilese("text.txt")
' А вот и вопрос, как дальше получить значение fname из эвента, причем в эту функцию?


End Func


Надо что бы Функция GetFiles вернула значение которое появляется в эвенте (fname)
То есть она должна какбы ждать пока появится эвент.
Можно конечно извратится с усыплением потока и мониторить какую либо переменную... но выходит както тяжеловато...
Может есть способы попроще?
Moderator VBStreets
---------------------------

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Отслеживание Events

Сообщение MIT » 15.12.2008 (Пн) 14:45

Несколько раз перечитал вопрос, возможно что-то не понял.

Можешь попробовать сделать так:
GetFiles вызвывает FileSearch и завершается
FileSearch своим эвентом вызвывает другую функцию, соответственно GetFiles эвентов ждать не должен, а весь функционал обрабатывается третьей функцией
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Re: Отслеживание Events

Сообщение ASD » 15.12.2008 (Пн) 14:57

MIT писал(а):Несколько раз перечитал вопрос, возможно что-то не понял.

Можешь попробовать сделать так:
GetFiles вызвывает FileSearch и завершается
FileSearch своим эвентом вызвывает другую функцию, соответственно GetFiles эвентов ждать не должен, а весь функционал обрабатывается третьей функцией


Нет.
FileSearch это эвент! Он срабатывает когда clFiles сделали свою работу.
И мне не надо что бы GetFiles завершалась, мне надо что бы она вернула то, что в FileSearch, а именно стринг fname.
Когда я вызываю функцию GetFiles она выполняет в себе clFiles.GetFilese и потом завершается....
Мне надо что бы она остановилась, дождалась когда сработает FileSearch (он есть эвент класса clFiles), получала fname из него
и только тогда завершалась, выплевывая это значение.

В идеале получается что бы можно было в функции написать так:
Function GetFiles(asdasd as string) as string
clFiles.GetFiles( asdasd)

z=Wait_Event (FileSearch) <- Тут функция ждет когда сработает event FileSearch и возвращает из него значение fname
(Ясно что такого нет, но может что то подобное?)

return z
end func

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Отслеживание Events

Сообщение MIT » 15.12.2008 (Пн) 15:54

Тогда могу предложить довольно кривой, но работающий метод:

объявляешь 2 глобальных переменных (Boolean и String)
в обработчике события FileSearch пишешь в Boolean значение True, в String паредаваемое эвентом значение
Ожидание реализовываешь по типу цикла проверки Boolean`а

p.s. нашел довольно сложный пример подобной ассинхронности написанный на основе потоков на C#, если хочешь, могу скинуть
p.p.s. за предложенный способ сильно не пинайте (а вы это дело любите), я и сам знаю, что это не фантан, и с радостью выслушаю более правильные варианты.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Отслеживание Events

Сообщение Nord777 » 15.12.2008 (Пн) 20:31

Код формы.
Код: Выделить всё
Public Class Form1
  Public WithEvents clsFiles As New clFiles

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox("Значение из GetFiles - " & GetFiles("test"))
  End Sub

  Private Function GetFiles(ByVal fname As String) As String
    Return clsFiles.GetFiles(fname)
  End Function

  Private Sub clsFiles_FileSearch(ByVal fname As String) Handles clsFiles.FileSearch
    MsgBox("Событие FileSearch")
  End Sub

End Class


Код класса.
Код: Выделить всё
Imports System.Threading

Public Class clFiles
  Public Event FileSearch(ByVal fname As String)
  Private Shared FnameRet As String
  Private Shared ResetEvent As AutoResetEvent


  Public Function GetFiles(ByVal fname As String) As String
    Dim myThread As New Thread(AddressOf ThreadProc)
    FnameRet = ""

    'создать экземпляр класса AutoResetEvent в несигнальном состоянии.
    ResetEvent = New AutoResetEvent(False)
    myThread.Start()

    'ожидать сигнального состояния
    ResetEvent.WaitOne()
    Return FnameRet
  End Function


  ''' <summary>
  ''' Выполняет в отдельном потоке эмуляцию какой-либо работы.
  ''' По завершению генерит событие FileSearch
  ''' </summary>
  Private Sub ThreadProc()
    Thread.Sleep(3000)
    FnameRet = "testEvent"
    RaiseEvent FileSearch(FnameRet)
    'установить сигнальное состояние
    ResetEvent.Set()
  End Sub

End Class

Из твоего сумбурного описания я возможно не совсем правильно понял структуру и взаимодействие классов/процедур,
но в любом случае, использование класса AutoResetEvent не вызывает никаких трудностей.
Только мне кажется ты не в ту сторону движешься. Как-то много заморочек.
Ты хочешь изначально асинхронные действия превратить в синхронные?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 77

    TopList  
cron