VC++初心者です。
VC++の中でFortranDLLを実行しているのですが、この実行中でも、メインウインドウで
の操作が可能にすることはできるのでしょうか?このDLLでは、コンソールが開きFotran
での計算結果などが表示されるプログラムで、少々時間もかかるため、実行中でもメイ
ンウインドウで他の作業をしたいと考えています。よろしくお願いします。
ワーカスレッドを作ってそっちに処理を委ねる
ありがとうございます。ワーカースレッドで解決できました。しかし、このFortranDLL
を実行中にこれを強制終了すると、メインウインドウも終了してしまいますが、これを
避けることはできますでしょうか?ちなみに以下のような方法でスレッドを実行してい
ます。
BOOL CCDoc::Test()
{
AfxBeginThread( MyThread, this );
return TRUE;
}
extern C _declspec(dllimport)
void _stdcall FORTDLL();
BOOL CCDoc::FORT()
{
FORTDLL();
return TRUE;
}
UINT MyThread( LPVOID WinObjPtr )
{
CCDoc* ptr = ( CCDoc* )WinObjPtr;
ptr->FORT();
return( 0 );
}
> しかし、このFortranDLLを実行中にこれを強制終了すると
「これ」って何?
FortranDLL が出すコンソールウィンドウのこと?
だったら無理です。防げません。
#SetConsoleCtrlHandler を調べてみて。まぁ調べても防げないけど。
そもそも「コンソールウィンドウ」とは、コンソールアプリの唯一のメインウィンドウ
であるべきで、便利な入出力ウィンドウとして使うべきではありません。
FortranDLL の作りを変えるのがベストかと。
別プロセスを作成して、そこでFortranDLLを実行するというのはいかがですか?
別プロセスというのは具体的にどういうことでしょうか?
>FortranDLL が出すコンソールウィンドウのこと?
FortranDLLって使ったことないのですが、
このコンソールウインドウが表示されて処理を行い、コンソールウインドウが
閉じたことってアプリケーション側で知ることが出来ないのですか?
それがわかれば、そのときまで非常時を除いてワーカスレッドを終了するのを
待っていればいいと思いますが。
例、
「WaitForSingleObject」でイベント待ちにする。
コンソールウインドウが終了したらイベントを出してスレッドを終了させる。
>別プロセスというのは具体的にどういうことでしょうか?
「CreateProcess」を参照のこと。
> 別プロセスというのは具体的にどういうことでしょうか?
FortranDLLを呼び出すためのEXEを作成し、それをメインのプログラムから
実行させる、ということです。
このようにすれば、FortranDLLが出すコンソールを強制終了させても
メインのプログラムにまで影響が及ぶことはないと思います。
FortranDLLへは引数を渡しているため、別プロセスにするとこれができなくなると思い
ますので、別プロセスは無理のようですね。やはりコンソールの強制終了をしないよう
にするしかないでしょうか。
コマンドライン引数を使うとか、パイプを使って通信するとか、
ファイル経由で読み書きするとか、やり方は幾らでもあると思いますが。
> コンソールウインドウが閉じたことってアプリケーション側で知ることが出来ないの
ですか?
検出はできますが、その後にできることはプロセスの終了だけです。
コンソールを閉じられてもプロセスを継続するということはできません。
>検出はできますが、その後にできることはプロセスの終了だけです。
>コンソールを閉じられてもプロセスを継続するということはできません。
FortranDLLでコンソールウインドウを表示させていると思いますので、
戻り値等でコンソールウインドウが閉じて処理が終了したことが分れば
後はスレッドがそれまで待てばいいのかなと思いました。
引数として非常に大きな配列を渡しているため、コマンドライン引数だと都合悪く、フ
ァイル経由はもともとやっていて、これをやりたくなくてDLLにしました。というわけ
で、パイプとはどんなものなんでしょう?
とりあえずワーカスレッドで行きます。ありがとうございました。