|
|
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. если в Буфер что то приходит, и размер NumberOfBytesRead не равен 0, GetLastError = 0 если в Буфере пусто, и размер NumberOfBytesRead = 0, GetLastError = 109 - Канал закрыт сам PipeRead имеет только номер процесса как проверить перед выполнением Windows.ReadFile(PipeRead, Buffer, 16382, NumberOfBytesRead, nil) если результата не будет, то не выполнять вышеприведенный код очень не красиво в finally end ставить SetLastError(0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 15:09 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63Stream.Write(PipeRead, NumberOfBytesRead); Это что за бред? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 15:21 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63 очень не красиво в finally end ставить SetLastError(0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:30 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63, ты же как-то трубу у себя открываешь? тут же самого главного - кода открытия - нет, но зачем то есть код чтения, к тому же неверный. вот на открытии и проверяй. открылась труба - значит ок. нет - значит трубы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:49 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
14.02.2020 18:49, makhaon пишет: > открылась труба - значит ок. нет - значит трубы нет. при открытии да, но канал может сдохнуть и в процессе чтения. результат нужно проверять всегда. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:52 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий результат нужно проверять всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:18 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, код достаточно стаднтартный, запись текста из консоли, взят из Интернета еще за долго до меня. я пробежался и особо ни чего не придумал, разве только заменить чтение Pipe в поток через функцию. и так по тексту сначала CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); потом процесс if CreateProcess( nil, CommandMem, nil, nil, True, CreationFlags, nil, nil, StartupInfo, ProcessInfo) then begin GetExitCodeProcess(ProcessInfo.hProcess, AProcessExitCode); если процесс пошел, while AProcessExitCode = STILL_ACTIVE do begin далее получение текста из консоли Stream := TMemoryStream.Create; try while true do begin succeed := ReadFile(PipeOutputRead, Buffer, BufferSizeText, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; AOutput.LoadFromStream(Stream,TEncoding.GetEncoding(GetOEMCP)); finally Stream.Free; end; Result := True; end: end else begin Result := False; end; в конце закрытие и выдача результатов ALastOSError := GetLastError; GetExitCodeProcess(ProcessInfo.hProcess, AProcessExitCode); CloseHandle(ProcessInfo.hProcess); Result false или true если файл выполнился то true если файл выполнился то - GetExitCodeProcess(ProcessInfo.hProcess, AProcessExitCode) = 0 а вот GetLastError равен 0, пока не начинаю закрывать каналы, и притом возврат код сообщения, например 109 - канал закрыт. следующий шаг после 109 будет логично 87, так как параметры уже получиться нельзя, но это уже не интересно, так как результат из pipe получен AOutput и / или AError проблема с тестировщиками, им не нравится, мы протестировали, результат при наличии файлов и правильных команд даже с перенаправлением всегда есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 12:49 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63код достаточно стаднтартный, запись текста из консоли, взят из Интернета еще за долго до меня. Код достаточно бредовый, сразу видно что из интернета. Пора отказаться от отмазки "задолго до меня" и таки переписать его правильно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 13:40 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ни фига не отмазка, код с 2014-го лежит, приписка автора есть, который когда то был до нас но по сути, я сделал почти тоже самое, до его кода, есть какие то свежие решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 13:54 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63есть какие то свежие решения? В данном случае нужны не "свежие", а правильные решения. Как минимум - избавиться от Stream и начать ловить завершение приложения именно по закрытию трубки, а не GetExitCode. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 13:57 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
17.02.2020 13:57, Dimitry Sibiryakov пишет: > начать ловить завершение приложения именно по закрытию трубки, а не GetExitCode. не-а. каноны велят отделять мух от котлет. закрытие трубы всё таки не всегда тождественно завершению приложения. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 14:13 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийзакрытие трубы всё таки не всегда тождественно завершению приложения. "Чо?" Кто ж её закроет-то? И самый главный вопрос: а что делать с приложением, которое её таки закрыло? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 14:20 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
при обломе трубы жди СиглОбжект. если WAIT_OBJECT_0, получай ЭкзитПроцессКоде если WAIT_FAILED, получай ЛастЕгор "А кулаками махать любой дурак умеет." (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 14:25 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63, готовая реализация не подойдет? в жедаях например: https://github.com/project-jedi/jcl/blob/3a1b1681dfc2e461c02e44255a60b582a6e44b35/jcl/source/windows/JclMiscel.pas#L66 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 14:31 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
17.02.2020 14:31, makhaon пишет: > готовая реализация не подойдет? в жедаях например: мощно! Код: pascal 1. 2. 3. 4. дайте две! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 14:40 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
джеди не пойдет, WinExec32AndRedirectOutput - нет, ... "Герои не ищут легких путей", хочу правильных решений и чем больше, тем лучше, и так что сделать со Stream? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 18:35 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
стрим в данном случае нахрен не нужен. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 18:46 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63, может подойдет Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. взято здесь Перенаправление вывода в файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 18:57 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Zeliusможет подойдет Очередной нагугленный код, который решает не совсем ту задачу, которая стоит. Вот так сон разума и рождает чудовищ. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 19:09 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий, что не так? yemets63, ну ок, делай свой очередной велосипед. Безумству храбрых поем мы славу! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 07:18 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
makhaon ну ок, делай свой очередной велосипед. Безумству храбрых поем мы славу! полностью согласен, но политика местной партии напрягает, и вынуждает начать все с квадратных колес, были решения проще и все рабочие. но примерно раз в год когото прёт, и приходится придумывать велосипеды, которые ездят боком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 10:02 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Мимопроходящийзакрытие трубы всё таки не всегда тождественно завершению приложения. "Чо?" Кто ж её закроет-то? И самый главный вопрос: а что делать с приложением, которое её таки закрыло? её вызывающий должен закрывать, но никак не вызываемый если по правильному, то вызываемому приложению даётся только дубликат хэндла - хоть зазакрывайся другое дело, что обычно чтение делают в другом потоке в бокирующем режиме и закрывают Pipe когда убеждаются, что вызываемое приложение завершено, естественно вывалится ошибка на чтении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 10:33 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
расскидал стандартный текст из интернета, о чем речь шла сначала по своему, протестировал сам, сделал кучу прерываний, убивал потоки и разрушал файлы, реакция есть. до сих пор не понятно, почему когда нет ошибки и буфер пуст показывает что канал закрыт, номер 109, в итоге я его тупо ставлю в 0. ошибки при процессах если не создавать нет. короче отдал на тестирование, через пару дней будет ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 11:47 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63, MSDNIf an anonymous pipe is being used and the write handle has been closed, when ReadFile attempts to read using the pipe's corresponding read handle, the function returns FALSE and GetLastError returns ERROR_BROKEN_PIPE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 11:52 |
|
||
|
Нужно получить значение из канала PIPE, но когда оно пустое, пишет ошибку Канал закрыт
|
|||
|---|---|---|---|
|
#18+
yemets63, то есть даже посмотреть в жедаях как сделано не вариант, ну ок, тогда продолжай кактус грызть вот ссылка прямо на сам код, а то вместе с Мимипроходящим так мимо и пройдете https://github.com/project-jedi/jcl/blob/bde454905aac7f961350e5c36af5ad0a4713963b/jcl/source/common/JclSysUtils.pas#L2993 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2020, 11:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39927878&tid=2038554]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 385ms |

| 0 / 0 |
