Events из Thread

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Events из Thread

Сообщение xenomorph » 20.09.2004 (Пн) 9:08

Добрый день всем!

Я столкнулся с необходимостью запуска события из отдельного потока.
Согдасно исходнику от M$ легко это не получиться ...
и вообще при попытке обратиться на основной код из проги - поток начинает колбасить ...

см. аттачь.

EventProblem
EventSoln

Вопрос - как нормально выкрутиться?

Я запускаю CreateProcess - calc.exe, и блокирую тред WaitForSingleObject до терминации потока ...
След. комманда - в треде должна ...
(сделать что-то что будет замечено из основного кода 8)

EventSoln вроде работает ... но может у кого есть\были другие решения?

Особо приветствуються _ДЕЛЬНЫЕ_ советы!
Вложения
threading_ms.rar
(21.35 Кб) Скачиваний: 28
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 20.09.2004 (Пн) 10:39

почитай тут, ребята тоже мучались:
http://forum.sources.ru/index.php?showtopic=64453
Если руки кривые, то не надо ругать разработчиков.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 20.09.2004 (Пн) 11:21

этот код не будет работать под VB6 долго писать почему
(на VB5 да будет работать)

посмотри http://www.vbaccelerator.com/codelib/thread/inprogan.htm

а зачем тебе нужен event из потока ?
наверное Memory maped files можно обойтись
Напиши подробнее

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2004 (Пн) 15:57

xenomorph, может тебя объекты синхронизации спасут? (эвенты, семафоры...)
А вообще, codemaster прав: напиши подробнее, в чём у тебя дело.
Изображение

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Вот, блин, Клинтон ...

Сообщение xenomorph » 20.09.2004 (Пн) 21:10

Тыкс ... пыкс ... мыкс ...

Спасибо за советы! (и линки) ...
Я посмеялся вот с чего:

> ... но ЕСЛИ я например сделаю MsgBox "URA, rabotaet !!", то мой клиент
> вылетает именно на MsgBox`е ...

>> Дело в том, что любой СОМ-объект подключенный в ВБ исполняется в своем
>> апартаменте, который не находится в адресном пространстве виртуальной
>> машины. Из-за этого могут возникать проблемы связанные с остановкой ф-ии
>> обработки сообщений. В общем, такие потоконебезопасные ф-ии в подобном
>> проекте использовать просто нельзя.

> тоесть, если я делаю поток в своем контроле, то нельзя клиента на VB
> делать?, правильно я понял?

>> Почти, просто в потоке нельзя использовать ф-ии ВБ и, только АПИ. Вот
>> попробуй, скажем, вызвать АПИ ф-ю MessageBox, должна заработать.

> да, MessageBox заработала, но теперь вылетает после нее.

8)))))))))))))!!!)))))Cool!))))))))
Я тут пополу покатался - от смеха ... 8)))) Не в лоб так по лбу 8)))!
(не знаю почему но меня погребло ... (до сих пор гребёт 8)))

Теперь серёзно.

Я так понял внутри треда - начинаеться ручной секс 8).
АПИ и ничего более (где-то я уже шелл-код писал 8))), никода б не подумал
что в ВБ прийдёться восстанавливать такие навыки 8))) - почти старинное искусство 8))).
Разнича в двойных нулях *), точнее в их отсутствии 8))

(кстати - НЕ пашет - успел проверить - после выполнения всех АПИ всё падает в риале,
в ИДЕ - стабильненько 8((( )

Со вторым линком сложнее ...

'If we made it this far, then we can start using normal VB calls
'because we have an initialized object on this thread

Я так понял что инициализируеться какой-то объехт и уже в нём ВБ функции пахай (?).
Вопрос: а можна туда класс запихнуть (?) Вообщем пока для меня решения\е -
не очевидны ...

Чистое АПИ + перец был прав - конструкция:

label.caption = "Done" - пашет ...
(подозреваю она отсылает сообщение, а оно проходит по др. механизму ...
в итоге (уже проверил - работает и нормально!)


Для парсировки ивента в основной код заюзаю невидимое поле + таймер +
поменять его название => label.caption = "Done" ///

В принципе мне надо было отмониторить ивент завершения внешнего процесса -
запустить калькулятор и получить ивент прекращения его работы. НЕ блокируя при этом
свою прогу ...

'==============================

'Start the shelled application:

Call CreateProcessA(vbNullString, "calc.exe", 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc)

'Wait for the shelled application to finish:
'Call WaitForSingleObject(proc.dwThreadID, INFINITE)
'==============================

Пока никак 8(. Или тут есть кусок васиковых инструкций, или одно из двух 8)))

Чистые АПИ в треде работают. А вот CreateProcessA здыхает.

Спасибо всем кто принимал участие!

Авось кому ещё пригодиться.

З.Ы. Если у кого есть материалы по малтитредингу - ПОСТте здесь! 8)

Удачи!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2004 (Пн) 21:20

xenomorph, честное слово, эвенты (CreateEvent, SetEvent, etc) бы тебя спасли...
А так, с таймером и опросом, - чем же это лучше, чем напрямую опрашивать GetExitCodeProcess? Там и новые нити не нужны.
Изображение

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 21.09.2004 (Вт) 17:07

Думаю ты прав ...

Как заюзать GetExitCodeProcess?

У меня почему-то не аолучилось 8(.

hndl CreateProc(...

Ждём, убиваем ...

GetExitCodeProcess(hndl)

А оно, редиска, 1 возвращает, даже если процесс убит 8(
Что не так?

Огромное спасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.09.2004 (Вт) 17:20

Что значит - что не так? Видимо, это и есть код выхода :)
Процесс живёт до тех пор, пока не закрыт последний экземпляр HPROCESS. А ты не юзаешь CloseHandle, как я погляжу :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Вот, блин ... 8)

Сообщение xenomorph » 21.09.2004 (Вт) 18:39

2 GSerg шото я тебя не понял 8)
Но зато я с перепоя сообразил чего я лажаюсь - нефиг PID с ProcessHandle путать 8))))

Вот родил ...
(иногда многие очевидные решения стоят много крови ... 8-)

Запихнуть в модуль, обозвать mod_CheckProcessTermination
и юзать по необходимости 8)
'================================================
Option Explicit

Dim l_PID As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Public Sub ShellIt(s_FileName As String)

l_PID = Shell(s_FileName)

End Sub

Public Function IsStillActive() As Boolean

If OpenProcess(1, 1, l_PID) > 0 Then
IsStillActive = True
Else
IsStillActive = False
End If

End Function
'================================================

На формочку (ну или куда надо 8):

'================================================
Option Explicit

Private Sub Command1_Click()
Call mod_WaitForProcessTermination.ShellIt(Text1.Text)
End Sub

Private Sub Command2_Click()
MsgBox mod_WaitForProcessTermination.IsStillActive
End Sub

'================================================

+ 2 Бат`она 8) и 2 Те=Х=т бокса 8).
Душим один батончик - съедаем хендл.
Второй - мониторит наличие такого пида в списке процессов.

Вообщем мне этот вариант больше понравился чем с
WaitForSingleObject - так как он не тормозит выполнение кода.

Таймер для опроса единственный минус.

Замена на CreateProc принципиально ничё не изменит. (параметры не в счёт 8).
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: С.Т. и гости: 3

    TopList