EmbarcaderoのC++ 10 Seattleで書かれたVCLアプリケーションがあります。メインスレッドは、転送中に接続が失われた場合、Getメソッドが無期限にハングするため、TIdFTP機能を実行するスレッドを生成します。このアイデアは、接続が掛かっているかどうかを検出し、スレッドを孤立させ、「再試行」を開始することです。私の問題は、私は、仕事関数を実装し....スレッド内のTIdFTPが起動しない作業方法
class FTPThread : public TThread
{
protected:
void __fastcall Execute();
void __fastcall UpdateUI();
public:
__fastcall FTPThread(bool CreateSuspended);
String FTPhostname;
String FTPusername;
String FTPpassword;
String remoteDir;
String localDir;
String localTempDir;
String fileName;
TIdFTP *FTPClnt;
void __fastcall FTPClntWorkBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax);
void __fastcall FTPClntWorkEnd(TObject *ASender, TWorkMode AWorkMode);
void __fastcall FTPClntWork(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount);
void __fastcall FTPClntAfterGet(TObject *ASender, TStream *AStream);
};
を次の私は、スレッドのHファイル内のオブジェクトを宣言しただけでなく、火災すべき方法(WorkBegin、WorkEnd、仕事、など)が好きですGETは、転送を開始し、完了すると、このようなスレッドのCPPファイルで.....これらのメソッドの
void __fastcall FTPThread::UpdateUI()
{
if (FrmFTP) {
//FrmFTP->FTPProg->Max = fileSizeBytes;
FrmFTP->FTPProg->Position = ftpProgress;
FrmFTP->BringToFront();
Application->ProcessMessages();
}
}
void __fastcall FTPThread::FTPClntWorkBegin(TObject *ASender,
TWorkMode AWorkMode, __int64 AWorkCountMax) {
ftpProgress = 0;
if (FrmFTP) {
FrmFTP->FTPProg->Max = fileSizeBytes;
}
Synchronize(&UpdateUI);
}
// ---------------------------------------------------------------------------
void __fastcall FTPThread::FTPClntWorkEnd(TObject *ASender,
TWorkMode AWorkMode)
{
if (FrmFTP) {
ftpProgress = FrmFTP->FTPProg->Max;
}
Synchronize(&UpdateUI);
}
// ---------------------------------------------------------------------------
void __fastcall FTPThread::FTPClntWork(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCount)
{
ftpProgress = AWorkCount;
Synchronize(&UpdateUI);
}
// ---------------------------------------------------------------------------
void __fastcall FTPThread::FTPClntAfterGet(TObject *ASender,
TStream *AStream) {
ftpCompletionStatus = 1;
}
// ---------------------------------------------------------------------------
どれも今までに解雇されていません。なぜ彼らは発射しないだろうか?私のメインスレッドの同じ機能がうまくいきました。私はTIdFTPオブジェクトに実装したこれらのメソッドをどうにかしていないように感じていますが、その方法についてはわかりません。
ありがとうございます!
ありがとうございます。転送タイムアウトが5秒に設定されており、Getメソッドが返されることはありません。昨夜私の開発システムで一晩中吊り下げられ、Get呼び出しの後でコードの行を実行したことはありません。私のメインスレッドが永久に停止されないように、私はFTPソフトウェアをスレッドに入れなければならない理由を返すことはありません。 – martinarcher
私は自分のメインフォームにTIdFTPオブジェクトを持っていて、オブジェクトインスペクタが私のためのイベントハンドラをフックアップしていたとは思っていました。サンプルコードをありがとう....私は私のスレッドにFTPClntが作成されているメソッドを実行する方法を追加します。 – martinarcher
すべてのアクセスを同期させる必要があると言うと、フォームに触れるものをSyncronizeメソッドに移動する必要があるだけですか?再度、感謝します! – martinarcher