InDesign CS4 Pluginでスレッド処理


InDesign CS4のPlugin開発でスレッド処理を行ったので、メモしておきます。

まず、プロジェクトは「Sample」という名前でdollyxを使って生成しているものと想定します。

SampleID.hへ、スレッド用のBossとImplをDECLARE_PMIDします。

DECLARE_PMID(kClassIDSpace, kSampleThreadIdleTaskBoss, kSamplePrefix + XX)
DECLARE_PMID(kImplementationIDSpace, kSampleThreadIdleTaskImpl, kSamplePrefix + XX)

Sample.frにて、以下を適切な場所に追加します。

Class
{
	kSampleThreadIdleTaskBoss,
	kInvalidClass,
	{
		IID_IIDLETASKTHREAD,kSampleThreadIdleTaskImpl,
	}
}

SampleFactoryList.hへ、クラスとImplを関連づけさせる為のREGISTER_PMINTERFACEを記述します。

REGISTER_PMINTERFACE(SampleThreadIdleTask, kSampleThreadIdleTaskImpl)

Threadを処理するクラスを使用する箇所へ以下のメンバーを追加します。

IIdleTaskThread* fIdleThread;

Threadの開始処理を記述します。

fIdleThread = ((IIdleTaskThread*) ::CreateObject (kSampleThreadIdleTaskBoss, IID_IIDLETASKTHREAD));
if (fIdleThread) {
fIdleThread->InstallTask(5000);
}

Threadの停止処理を記述します。

if (fIdleThread)
{
fIdleThread->UninstallTask();
fIdleThread->Release();
}

では実際にThread処理を行うクラスを書いていきます。まずヘッダーファイルを作成します。「SampleThreadIdleTask.h」というファイルを作成して記述しました。

#ifndef __SampleThreadIdleTask_h__
#define __SampleThreadIdleTask_h__

#include "IIdleTaskThread.h"

class SampleThreadIdleTask : public CPMUnknown<IIdleTask>
{
public:
	SampleThreadIdleTask(IPMUnknown* boss) : CPMUnknown<IIdleTask>(boss){}
	void InstallTask(uint32 millisecsBeforeFirstRun);
	void UninstallTask();
	uint32 RunTask(uint32 appFlags, IdleTimer* timeCheck);
	const char* TaskName();

	void ProcessIdle( void );

private:

	K2Vector<PMString> filesProcessed;

};

#endif	// __SampleThreadIdleTask_h__

最後にThread処理を行うクラスのソースコードを記述します。「SampleThreadIdleTask.c」というファイルを作成しました。

#include "VCPlugInHeaders.h"

#include "SampleThreadIdleTask.h"

// Interface includes:

// General includes:

#include "SDKUtilities.h"
#include "CAlert.h"
#include "CPMUnknown.h"

#include "IIdleTask.h"
#include "IIdleTaskMgr.h"

// Project includes:
#include "SampleID.h"

// Templates:
#include "K2Vector.tpp"

CREATE_PMINTERFACE(SampleThreadIdleTask, kSampleThreadIdleTaskImpl);

void SampleThreadIdleTask::InstallTask(uint32 millisecsBeforeFirstRun)
{
	InterfacePtr<IIdleTaskMgr> idleTaskMgr(GetExecutionContextSession(), UseDefaultIID());
	if( idleTaskMgr) idleTaskMgr->AddTask(this, millisecsBeforeFirstRun);
}

void SampleThreadIdleTask::UninstallTask()
{
	InterfacePtr<IIdleTaskMgr> idleTaskMgr(GetExecutionContextSession(), UseDefaultIID());
	if( idleTaskMgr) idleTaskMgr->RemoveTask(this);
}

uint32 SampleThreadIdleTask::RunTask(uint32 appFlags, IdleTimer* timeCheck)
{
	if( appFlags & (IIdleTaskMgr::kMouseTracking | IIdleTaskMgr::kUserActive))
		return kOnFlagChange;

	ProcessIdle();

	return 3000;	// 3秒間スリープ
}

const char* SampleThreadIdleTask::TaskName()
{
	return "SampleThreadIdleTask";
}

//--------------------------------------------------------------------
//	ProcessIdle - check if any files have been dropped in folder
//--------------------------------------------------------------------
void SampleThreadIdleTask::ProcessIdle()
{
	// アイドル処理
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。