HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0727
orz標準出力が得られない7解決


orz

リンク

2011/7/27(Wed) 18:20:07|NO.40247

ffmpegの様なCUIソフトをGUIで動かすソフトを作っていて、
コマンド付きで実行してやることは出来たのですが、
標準出力(?)を得られなくて躓いてしまいました。

http://lldev.jp/hsp/script/clapp_redirect_var.html
http://hspnext.com/hspkura/hspkura02.htm
(「GUIからコンソールを操作する」の部分)
これらのページの解説とサンプルを参考に書いてみたのですが、
ffmpegが動いている間は親のプロセスがフリーズし、
出力も得られませんでした。
(変換が終わるかタスクマネージャーでffmpegのプロセスを
強制終了してやると親プロセスのフリーズもとけました)

調べてみたところReadFile実行したところでフリーズし、
フリーズがとけるとReadFileが失敗して戻り値0が返ってきていました。

WaitForSingleObjectは使っていないので
ffmpegの実行待ちということも無いと思います。
ffmpegの代わりに前述したページのcb.exeで試してみたら、
成功してクリップボードの内容が表示されました。
ただ、
	repeat 20
mes cnt wait 50 loop
こんな感じの実行ファイルを作って試してみたら、
子プロセスが存在している間は同じようにフリーズしてしまいましたが、
子プロセス終了後、一気に0〜19が表示されました。

AllocConsoleを使えば出力を得られるのは確認していますが、
パイプの使い勝手を覚える練習でもあるので出来ればパイプでやりたいです。

変換の進行状況を知るためにffmpegの出力を使おうと思っているので
リアルタイムで出力を得られるようにしたいです。
どのようにしたらいいでしょうか。



この記事に返信する


Cookies

リンク

2011/7/28(Thu) 19:20:20|NO.40268

hspnextさんのスクリプトを参考にしたってことは、APIを使ったのかな?
ならこれは関係ないかな。
http://hsp.tv/play/pforum.php?mode=pastwch&num=16690

あと、これはどうなのかな。
http://mobilehackerz.jp/archive/wiki/index.php?iPod

あなたのスクリプトがあってると仮定して、
「ffmpeg フリーズ」で検索しました。



さくら

リンク

2011/7/28(Thu) 20:25:22|NO.40272

ffmpegについては、全く利用したことがないので、わかりませんが・・・・
標準出力の確認のために、下記のモジュールで、ちゃんと実行できますか?
cmdexec buf, "type " + dir_exe + "\\hsphelp\\e3dhsp3.hs"の部分にffmpegをパラメータ
として渡してもらえますか?

#module ;************************************************************ ; 【参考】 ; URL http://officetanaka.net/excel/vba/tips/tips27.htm ;************************************************************ #deffunc cmdexec var dbuf, str cmd newcom WshShell, "WScript.Shell" comres ret WshShell-> "Exec" "%ComSpec% /c " + cmd wait 1 while : if ret("Status") == 0 : _break : wait 200 : wend if ret("Status") == 0 { ret = ret("StdOut") dbuf = ret("ReadAll") } delcom WshShell return #global sdim buf, 1024*256 cmdexec buf, "type " + dir_exe + "\\hsphelp\\e3dhsp3.hs" font msgothic, 14 : objmode 2 mesbox buf, ginfo_winx, ginfo_winy, 5 stop


HSP-NEXTのsysopt06.hspサンプルモジュール部分を下記のように変更して
試してもらえますか? (不具合と思われる部分を修正しました。)


;***** コンソールアプリのプロセスが存在している間待つ ***** hprocess=lppiProcInfo(0) p=WaitForSingleObject(hprocess,50) ret=CloseHandle(hWrite) rcvbuf="" //Buffer Size HSP側で自動確保 if p>0 { repeat await 10 ;***** 標準出力パイプの内容を調べる ***** ret=PeekNamedPipe(hRead,0,0,0,varptr(dwStdOut),0) if dwStdOut>0 { ret=ReadFile(hRead,szBuf,4096,dwRead,0) if dwRead<4096 : memcpy szBuf, szBuf, dwRead, 0, 0 : poke szBuf, dwRead : rcvbuf+=szBuf : break if dwRead==0 : break } rcvbuf+=szBuf loop }



さくら

リンク

2011/7/28(Thu) 21:07:59|NO.40274

連続投稿ですみません。今、少し試行錯誤していまして試してみたら
たぶん 下記の処理では、WaitForSingleObjectは、不要ですね(^^;

;***** コンソールアプリのプロセスが存在している間待つ ***** hprocess=lppiProcInfo(0) //p=WaitForSingleObject(hprocess,50) ret=CloseHandle(hWrite) rcvbuf="" //Buffer Size HSP側で自動確保 ;if p>0 { repeat await 5 ;***** 標準出力パイプの内容を調べる ***** ret=PeekNamedPipe(hRead,0,0,0,varptr(dwStdOut),0) if dwStdOut>0 { ret=ReadFile(hRead,szBuf,4096,dwRead,0) if dwRead<4096 : memcpy szBuf, szBuf, dwRead, 0, 0 : poke szBuf, dwRead : rcvbuf+=szBuf : break if dwRead==0 : break } rcvbuf+=szBuf loop ;}



skyblue

リンク

2011/7/29(Fri) 19:04:29|NO.40283

パイプつき実行するためのpipeexecが標準で使えるのでそちらを使ってはどうですか?



orz

リンク

2011/7/29(Fri) 21:01:06|NO.40286

>>Cookiesサマ
僕の説明が悪かったです。すみません。
ffmpegがフリーズするのではなく、ffmpegを実行した
親プロセス側がフリーズしているわけなので、
変換も最後まで進みますし、ffmpeg自体にバグは無いと思います。

色々と調べていただき有難うございました。


>>さくらサマ

「F\ffmpeg」フォルダに「ffmpeg.exe」と
http://lldev.jp/hsp/script/clapp_redirect_var.html
↑のページの「cb.exe」をおいて試しています。

ffmpegは「http://blog.k-tai-douga.com/」のものを使い、
コマンドはこんな感じ↓にしています。
F:\ffmpeg\ffmpeg.exe -i F:\ffmpeg\a.avi -vcodec copy -an F:\ffmpeg\b.avi


上のWshShellを使った場合

dir_exe + "\\hsphelp\\e3dhsp3.hs" を
"F:\\ffmpeg\\ffmpeg.exe -i F:\\ffmpeg\\a.avi -vcodec copy -an F:\\ffmpeg\\b.avi"
に置き換えて実行すると、ffmpegが起動せず、何も起こりませんでした。

dir_exe + "\\hsphelp\\e3dhsp3.hs" を
"F:\\ffmpeg\\cb.exe"に置き換えて実行すると
mesbox内に「MZ」とだけ表示されました。


下のsysopt06.hspを使った場合

"dir"を"F:\\ffmpeg\\ffmpeg.exe -i F:\\ffmpeg\\a.avi -vcodec copy -an F:\\ffmpeg\\b.avi"
に置き換えて実行すると、
ffmpegが実行され、変換をしている間も
親プロセスはフリーズせずに反応していましたが、
ffmpegでの変換をしている最中も終了した後も、なにも表示されませんでした。
(mesboxも表示されませんでした)

調べてみたところ「if dwStdOut>0」の条件分岐ではじかれている、
つまり、PeekNamedPipeが失敗し戻り値として0が返ってきていて
breakできずに無限ループをしていてそこから進めていないようでした。

"dir"を"F:\\ffmpeg\\cb.exe"に置き換えて実行すると、
正しく実行されたらしくクリップボードの内容が表示されました。



orz

リンク

2011/7/29(Fri) 22:51:43|NO.40288

自己解決しました。
教えてくれた方々、ありがとうございました。



orz

リンク

2011/7/29(Fri) 22:52:10|NO.40289

解決



ONION software Copyright 1997-2021(c) All rights reserved.