Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Асинхронные named pipes / 3 сообщений из 3, страница 1 из 1
18.08.2009, 14:23
    #36150126
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные named pipes
вот здесь углядел пример соединения named pipes. все тут понятно.но както нехорошо оставлять серверное приложение в ожидание коннекта навсегда, если клиенту так и не потребуется сервер.
После комманды m.res = ConnectNamedPipe(pipehnd, 0) оно снимается только диспедчером задач.
вычитал про асинхронный режим без ожидания
написл такой код сервера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
DECLARE INTEGER CreateEvent  IN WIN32api INTEGER,INTEGER,integer,string @
*DECLARE INTEGER OpenEvent  IN WIN32api INTEGER,integer,string @

i=CreateEvent( 0 , 0 , 0 ,"ConnectNamedPipe")

*typedef struct _OVERLAPPED 
*{  DWORD  Internal;      
*  DWORD  InternalHigh;  
*  DWORD  Offset;        
*  DWORD  OffsetHigh;    
*  HANDLE hEvent;   // указатель на событей устнавливаемое при завершении операции }    
OVERLAPPED=REPLICATE(CHR( 0 ), 16 )+wordtostr(i)

#DEFINE STANDARD_RIGHTS_REQUIRED 0xF0000
#DEFINE PIPE_ACCESS_OUTBOUND 0x00000002
#DEFINE PIPE_NOWAIT 0x00000001
#DEFINE PIPE_TYPE_MESSAGE 0x00000004
#DEFINE FILE_FLAG_OVERLAPPED 0x40000000
#DEFINE PIPE_TYPE_BYTE 0x00000000
#DEFINE ERROR_PIPE_CONNECTED  535 

DECLARE INTEGER GetLastError IN kernel32

DECLARE INTEGER CreateNamedPipe IN kernel32;
	STRING lpName, INTEGER dwOpenMode, INTEGER dwPipeMode,;
	INTEGER nMaxInstances, INTEGER nOutBufferSize, INTEGER nInBufferSize,;
	INTEGER nDefaultTimeOut, INTEGER SECURITY_ATTRIBUTES

DECLARE INTEGER ConnectNamedPipe IN kernel32 INTEGER hNamedPipe, string @ lpOverlapped

DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject

DECLARE INTEGER WriteFile IN kernel32 INTEGER hFile,;
STRING lpBuffer, INTEGER nBt2Write, INTEGER @ lpBtWritten, INTEGER lpOverlapped

WAIT WINDOW NOWAIT "CreateNamedPipe"
pipehnd = CreateNamedPipe("\\.\pipe\PPing", BITOR(PIPE_ACCESS_OUTBOUND,FILE_FLAG_OVERLAPPED,PIPE_TYPE_MESSAGE,PIPE_NOWAIT), ;
	PIPE_TYPE_BYTE,  1 ,  0 ,  0 ,  500 ,  0 )
If pipehnd =  0 
	= CloseHandle(pipehnd)
	MESSAGEBOX("Error1")
	CLEAR DLLS
	RETURN
ENDIF
WAIT WINDOW NOWAIT "ConnectNamedPipe"
s=SECONDS()
m.res = ConnectNamedPipe(pipehnd, @OVERLAPPED)
WAIT  WINDOW "wait" TIMEOUT  20 
? SECONDS()-s
If m.res <>  0  .Or. (res =  0  And GetLastError() = ERROR_PIPE_CONNECTED)
	? m.res 
	m.buffer = ALLTRIM(STR( 100 )) && íà áóäóùåå
	m.lenbuf = LEN(m.buffer)
	m.written =  0 
	m.res = WriteFile(pipehnd, m.buffer, m.lenbuf, @m.written,  0 )
	? m.written
Else
	= CloseHandle(pipehnd)
	MESSAGEBOX("Error2"+STR(GetLastError()))
* 6  The handle is invalid.  ERROR_INVALID_HANDLE
	CLEAR DLLS
	RETURN
ENDIF
WAIT clear
MESSAGEBOX("Ok!")
= CloseHandle(pipehnd)
CLEAR DLLS
return
на команду m.res = ConnectNamedPipe(pipehnd, @OVERLAPPED)
зависания не происходит , но получаю ошибку ERROR_INVALID_HANDLE.
вероятно как то не так создал я эту структуру OVERLAPPED.
подскажите, пожалуйста, как этот указатель пристроить в строку структуры?
...
Рейтинг: 0 / 0
25.09.2009, 09:49
    #36216544
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные named pipes
ну структура то создана у меня была правильно, а ошибочка в создании трубки
правильный вызов такой
Код: plaintext
1.
pipehnd = CreateNamedPipe("\\.\pipe\PPing", BITOR(PIPE_ACCESS_OUTBOUND,FILE_FLAG_OVERLAPPED), ;
	BITOR(PIPE_NOWAIT,PIPE_TYPE_MESSAGE),  1 ,  0 ,  0 ,  500 ,  0 )
получилось почти то что хотел, но не совсем.
теберь бы после запуска неблокирующего ожидания коннекта
Код: plaintext
m.res = ConnectNamedPipe(pipehnd, OVERLAPPED)
узнать что было все таки соединение или нет.
догадываюсь что как то надо оценить состояния созданного события или структуры
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
hEvent=CreateEvent( 0 , 1 , 0 ,"ConnectNamedPipe")
*typedef struct _OVERLAPPED 
*{  DWORD  Internal;   
*  DWORD  InternalHigh;
*  DWORD  Offset;        
*  DWORD  OffsetHigh;    
*  HANDLE hEvent;   }    
OVERLAPPED = GlobalAlloc(0x2000,  20 )
= SYS( 2600 , OVERLAPPED,  20 , REPLICATE(CHR( 0 ), 16 )+dwordtostr(hEvent))
но что то не могу найти функций возвращающих такое состояние.

подскажите? пожалуйста функции api работы с событиями
...
Рейтинг: 0 / 0
30.09.2009, 15:58
    #36225531
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные named pipes
ну вот есть кое какой рабочий вариант (см приложенный архив)
есть сервер и клиент
запускаешь сервер - он крутит цикл (может при этом сделать что-то свое)
запускаешь клиента - передача, прием выполнены
это все работает только при условии что в сервере есть команда
wait window timeout 0.1
без нее тоже работает, только если окно фокса (в котором запущен сервер) активно или на него наведен указатель мыши.
полагаю что это какието сложности с многопотоковостью
способы _VFP.AutoYield = .t./.f. и doevents результата не дают

чем можно объяснить этот феномен?
как бы всетаки обойтись без wait window timeout 0.1 ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Асинхронные named pipes / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]