スレッド

  概要



スレッドは、詳しく理解するのは困難なカテゴリですが、使用するだけならば単純な仕様になっています。
注意すべきポイントはいくつかありますが、実際にテストしてみてその効果の違いを肌で感じるのが良いと思います。



  App_01.h

  
#define MyEXTERN extern
#include "MTN.h"

class App_01  
{
public:

	LboxCommdlg *Commdlg;

	App_01( HWND hDlg );
	App_01();
	virtual ~App_01();
};
  



  App_01.cpp

  
// *********************************************************
// コンストラクタ
// *********************************************************
App_01::App_01( HWND hDlg )
{

	// ダイアログオブジェクト作成
	Dlg = new LboxDlg( hDlg );
	Dlg->ChangeStyle( WS_MINIMIZEBOX | WS_SYSMENU, 0 );
	Dlg->ChangeExStyle( WS_EX_APPWINDOW, 0 );
	Dlg->StatusCreate( 0 );

	// プログラムID
	Dlg->EditSetText( IDC_PROGID, "HB010" );

	// 項目属性設定

	// 参照ダイアログ
	Commdlg = new LboxCommdlg();
	Commdlg->lpstrFilter = "CSV,*.csv";
}

App_01::App_01()
{

}

App_01::~App_01()
{
	delete Commdlg;
	delete Dlg;
}
  



  Dialog_01.cpp

  
#include "stdafx.h"

#include "App_01.h"

static App_01 *CurApp;
static LboxThread *Thread;
static LboxProgressBar *Pbar;
static DWORD WINAPI ThreadProc( LPVOID lpParameter );
static BOOL bCancel;

#define THREAD_END LBOX_USER + 1
// *********************************************************
// ダイアログの処理
// *********************************************************
LRESULT CALLBACK Dialog_01(
HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) {
		case WM_INITDIALOG:
			bEnd = false;
			CurApp = new App_01( hDlg );

			Dlg->Disable( IDC_CHECK );
			Dlg->Disable( IDC_CANCEL );

			// 初期フォーカス
			Dlg->EditFocus( IDC_REF );

			// スレッド
			Thread = new LboxThread();
			// プログレスバー
			Pbar = new LboxProgressBar();
			Pbar->hWnd = GetDlgItem( hDlg, IDC_PROGRESS );
			// キャンセル不可・終了可( 通常状態 )
			bCancel = true;

			return FALSE;

		case THREAD_END:
			// 通常状態
			bCancel = true;
			// スレッド完了処理
			Thread->Close();
			// 画面プロテクトの復帰
			Dlg->Disable( IDC_CANCEL );
			Dlg->Enable( IDC_REF );
			Dlg->Enable( IDC_CHECK );
			Dlg->Enable( IDCANCEL );
			break;

		case WM_COMMAND:
			// 終了
			if( LOWORD(wParam) == IDCANCEL ) {
				// 処理中の為終了不可
				if ( !bCancel ) {
					break;
				}
				// 終了処理
				bEnd = true;
				delete Pbar;
				delete Thread;
				delete CurApp;
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}

			// 参照
			if ( LOWORD(wParam) == IDC_REF ) {
				Buff->SetChar( 0, 0 );
				if ( CurApp->Commdlg->OpenFileName( Buff ) ) {
					Dlg->EditSetText( IDC_INFILE, Buff );
					Dlg->Enable( IDC_CHECK );
					Dlg->EditSetText( IDC_INCOUNT, "" );
				}
			}

			// 実行
			if ( LOWORD(wParam) == IDC_CHECK ) {
				// 処理中
				bCancel = false;
				// キャンセルボタン以外を使用不可
				Dlg->Disable( IDCANCEL );
				Dlg->Disable( IDC_REF );
				Dlg->Disable( IDC_CHECK );
				Dlg->Enable( IDC_CANCEL );
				// スレッド開始
				Thread->Create( NULL, ThreadProc );
			}

			// キャンセル
			if ( LOWORD(wParam) == IDC_CANCEL ) {
				// スレッド中止指令処理
				if ( !bCancel ) {
					bCancel = true;
				}
			}

			break;
	}
	return FALSE;
}

// *********************************************************
// スレッドの処理
// *********************************************************
static DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
	// 別スレッドなので、必要
	CoInitialize( NULL );

	LboxTextFile TxtIn;
	LboxToken Token;

	BOOL bRet;
	LONG nCount;

	Buff->Resize( 10000 );

	// ファイル名取得
	Dlg->EditGetText( IDC_INFILE, Item );
	// テキストファイルのレコード件数
	nCount = TxtIn.RecordCount( Item, Buff );
	// プログレスバーの範囲設定
	Pbar->SetRange( 1, nCount );
	// プログレスバーの増分設定
	Pbar->SetStep( 1 );
	// レコード件数表示
	Dlg->EditPrintf( IDC_INCOUNT, "%d", nCount );
	nCount = 0;

	// テキストファイルを開く
	bRet = TxtIn.ReadOpen( Item );
	if ( !bRet ) {
		Dlg->MsgOk(
			"入力ファイルをオープンできませんでした   "
		);
		Dlg->PostMsg( THREAD_END, 0, 0 );
		CoUninitialize( );
		return false;
	}
	// DB 接続
	if ( !CurDb->Connect() ) {
		TxtIn.Close();
		Dlg->MsgOk(
			"データベースの接続に失敗しました"
		);
		Dlg->PostMsg( THREAD_END, 0, 0 );
		CoUninitialize( );
		return false;
	}	

	// テーブルの既存データの削除
	Query->operator = (
		"delete from 郵便番号インポート"
	);
	CurDb->Query( Query );

	// テキストデータ読み込み
	bRet = TxtIn.Get( Buff );

	// データが存在し、かつキャンセルされていない間
	while( bRet && !bCancel ) {

		// 改行コード削除
		Buff->RemoveLastchar();
		// トークン作成
		Token.CreateToken( Buff, "," );

		// SQL作成
		Work->operator = (
			"insert into 郵便番号インポート"
			" values("
		);
		// 郵便番号(7桁)
		if ( Token.nCount < 1 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[0]);
			Item->SetChar( 7, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 都道府県名(半角カタカナ)
		if ( Token.nCount < 2 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[1]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 市区町村名(半角カタカナ)
		if ( Token.nCount < 3 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[2]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 町域名(半角カタカナ)
		if ( Token.nCount < 4 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[3]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 都道府県名
		if ( Token.nCount < 5 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[4]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 市区町村名
		if ( Token.nCount < 6 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[5]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (",");
		// 町域名
		if ( Token.nCount < 7 ) {
			Item->SetChar( 0, 0 );
		}
		else {
			Item->operator = (Token.Token[6]);
			Item->SetChar( 50, 0 );
		}
		Item->Enclose( "'" );
		Work->operator += (Item);
		Work->operator += (")");

		// SQL 実行
		bRet = CurDb->Query( Work );
		// 読み込み件数
		nCount++;
		// プログレスバー更新
		Pbar->Next();

		// テキストファイル読込み
		bRet = TxtIn.Get( Buff );
	}

	// DB 接続解除
	CurDb->DisConnect();
	// テキストファイルを閉じる
	TxtIn.Close();
	// プログレスバーリセット
	Pbar->Reset();

	// 呼び出し側へ終了通知
	Dlg->PostMsg( THREAD_END, 0, 0 );
	// COM 終了
	CoUninitialize( );
	// スレッド終了
	return true;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ