Тема: Пайпы
Показать сообщение отдельно

  #2  
Старый 19.10.2009, 23:44
Hiro Protagonist
Участник форума
Регистрация: 26.08.2009
Сообщений: 133
Провел на форуме:
193434

Репутация: 79
Отправить сообщение для Hiro Protagonist с помощью ICQ
По умолчанию

PHP код:
 
;.....некий код 
;Обнуляем буферы 
mov ecx
,1024 
mov edi
,offset BufDate1 
l
mov byte ptr [edi],
inc edi 
loop l 
mov ecx
,1024 
mov edi
,offset BufDate 
ll
mov byte ptr [edi],
inc edi 
loop ll 
;-- 
я бы прилюдно растреливал за такой код ... несудьба использовать для того предназначенные цепочечные команды?

PHP код:

lea edi
BufDate
mov ecx
512     ;=2048/4
xor eaxeax
rep stosd 
одним махом оба буфера =\

далее, ReadFile ты вызываешь _синхроно_, те поток там ожидает пока придут все данные (размер ктр ты передавал) или пайп убъется:
Цитата:
MSDN

ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs
Естественно все будет замораживатся. Решение состоит либо в асинхронном вызове ReadFile (та самая структура overlapped + порты завершения ввода-вывода), что неплохо описано у Рихтера. Так придется поступать, когда не знаешь сколько байт запишет в пайп другой процесс.

PS

да, и заполнять в твоем случае структуру через eax слишком накладно по размеру и регистрам

вместо

mov eax, hRead ;6 байт
mov cif.hStdOutput,eax ;6 байт

используй

push dword [hRead] ;5 байт
pop dword [cif.hStdOutput] ;5 байт

хотя и медленнее, зато экономятся байтеги и освобождается регистр, ктр можно использовать при передаче нулевых значений функции (push reg короче чем push imm на 3 байта).

Последний раз редактировалось Hiro Protagonist; 20.10.2009 в 00:03..
 
Ответить с цитированием