ここhttp://msdn.microsoft.com/en-us/magazine/cc163851.aspxFileUtilities.CopyFile
からCopyFileExのラッパーを使用しています。ファイルがコピーされるまでは呼び出されないと思いました(大きなファイルをコピーしてみました)。したがって、これを尋ねました。ファイルのコピー操作をキャンセルできるように、CopyFileExにレポートを返すにはどうすればよいですか?質問。しかし、実際には何度も呼び出されることがわかりましたが、何らかの理由で、進行状況を表示しようとしているフォームが混乱します。コピーが完了するまでフォームは更新されません。実際、イベントハンドラーで実行しようとすると、コピーが完了するまで、フォームにはボタンがあるはずの空のボックスがあります。何故ですか?CopyFileCallbackAction
Shown
1688 次
1 に答える
9
CopyFileEx
バックグラウンドスレッドから呼び出す必要があります。現時点では、への呼び出しCopyFileEx
はUIスレッドをブロックしています。そのため、UIは更新されません。
コールバックアクションは実際に繰り返し呼び出されます。これは、長時間実行されているファイル操作の進行状況をユーザーに報告できるようにするためです。
明確にするために、これはあなたが電話したときに起こることですCopyFileEx
:
Enter CopyFileEx
Start copying
Call your callback
Continue copying
Call your callback
....
Return from CopyFileEx
ファイルコピーの全期間中、実行中のスレッドはメッセージキューをポンピングするのではなく、ファイルのコピーでビジー状態になります。これはWinFormsであり、Win32ではありませんが、WinFormsは、標準のWin32GUIフレームワークの比較的軽量なラッパーです。メッセージキューは定期的に処理する必要があるため、長時間実行されるすべてのタスクをUIスレッドから実行する必要があります。
最後のポイント:進行状況のコールバックを取得するときは、UIを使用するInvoke
か更新する必要があることを忘れないでください。BeginInvoke
これは、UIを更新するコードをUIスレッドから実行する必要があるためです。
于 2011-12-05T23:25:41.927 に答える