DoEvents и API/ReadFile()

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

DoEvents и API/ReadFile()

Сообщение Taras2 » 06.12.2003 (Сб) 14:37

Открываю Пайп, запускаю прогу и забираю её стандартный вывод (пример можно найти в APIGuide/Pipes). Проблема в том, что во время выполнения API/ReadFile(), моя прога виснет (поток один). А мне нужно, чтобы пока выполняемая прога "рожала" вывод моя прога выполняла другие действия. Собственно нужно событие "Есть данные в Пайпе". Или подскажите какой функцией можно определить наличие данных в Пайпе (Хендле).

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

Сообщение GSerg » 07.12.2003 (Вс) 5:06

Ха ха :)
А как ты вызовешь эту функцию, если управление тебе не возвращено?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 07.12.2003 (Вс) 12:35

Чтобы программа выполняла какие-то еще действия в то же время - необходимо создать новый поток, в котором и считывать данные (либо работать, все равно).
Смотри пример на эту функцию в том же API Guide.

Код: Выделить всё
Declare Function CreateThread Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

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

Сообщение GSerg » 08.12.2003 (Пн) 9:48

Странные люди эти модеры - то утверждают о бесперспективности мультитрединга в VB, то предлагают заняться оным... :)
Кстати, gaidar, а что твоё звание означает? :oops:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.12.2003 (Пн) 10:55

Ну, тут ты немного неправ :) Пока одни модеры утверждают бесперспективность работы с потоками в VB, другие предлагают заняться оным :wink:

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 08.12.2003 (Пн) 13:43

GSerg писал(а):Странные люди эти модеры - то утверждают о бесперспективности мультитрединга в VB, то предлагают заняться оным... :)


Просто некоторые модераторы этим занимались, а некоторые нет :), вот и так. Хотя на самом дела сложновато это... Проще COM написанный на С++ юзать, а там уже многопоточность.

GSerg писал(а):Кстати, gaidar, а что твоё звание означает? :oops:


По-русски Иа-Иа, кто меня хорошо знает, может быть поймет ;)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 08.12.2003 (Пн) 15:16

Можно мне вставить свои 5 копеек? :)
gaidar писал(а):Чтобы программа выполняла какие-то еще действия в то же время - необходимо создать новый поток, в котором и считывать данные (либо работать, все равно).
Смотри пример на эту функцию в том же API Guide.

Код: Выделить всё
Declare Function CreateThread Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long


Это слишком сложно. Если включить FILE_FLAG_OVERLAPPED, то ReadFile() не ждёт данных, а просто забирает имеющиеся. Но как определить окончание данных? Т.е. некий аналог eof() в API.


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

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

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

    TopList