hakeの日記

Windows環境でプログラミングの勉強をしています。

関連付け起動時のQCopメッセージ(続き)

昨日の疑問を試すべく、実験してみる。goingToSendSetDocument(QString)とsetDocument(QString)を受信したときに時間のかかる処理をさせてみる。本当はRubyやShell Scriptのsleep(n)のような関数を使いたかったのだけれど、C++で相当するのが何かわからなかったので単純に1000行の文字出力をさせるようにしてみる。これでrcvqcop起動させているところにファイルタブから関連付けされているファイルをタップ。
結果、goingToSendSetDocument(QString)で呼ばれる処理を行う為にrcvqcopの画面に切り替わるのに時間がかかったけれども、画面をみるとしっかりqcopメッセージを受けたどおりの順番で処理を行っているみたい。
これが各メッセージ受信時の処理をスレッド処理をさせるとどうなるのかわかりませんけれども。

#include "rcvqcop.h"

RcvQCop::RcvQCop(QWidget *parent, const char *name)
		: QMainWindow(parent, name)
{
	setCaption("QCop Receive Test");

	eb = new QMultiLineEdit( this );
	setCentralWidget( eb );
	eb->clear();
	
	// QCopチャンネルを設定して、SLOTに接続する。
	QCopChannel *channel = new QCopChannel( "QPE/Application/rcvqcop", this );
	connect(channel, SIGNAL(received(const QCString&, const QByteArray&)),
		this, SLOT(printQCop(const QCString&, const QByteArray&)));

}


void RcvQCop::printQCop(const QCString &m, const QByteArray &d)
{
	if (m == "goingToSendSetDocument(QString)"){
		QDataStream d_stream(d, IO_ReadOnly);
		QString s, str;
		d_stream >> s;
		
		QTextOStream s_stream(&str);
		s_stream << "Rcv : Qcop Message A\n";
		s_stream << m << "\n";
		s_stream << s << "\n";
		eb->insertLine( str );

		for(int i = 0; i < 1000; i++){       // 1000行出力
			eb->insertLine( tr("A") );
		}

	}else if (m == "setDocument(QString)"){
		QDataStream d_stream(d, IO_ReadOnly); 
		QString s, str;
		d_stream >> s;
		
		QTextOStream s_stream(&str);
		s_stream << "Rcv : Qcop Message B\n";
		s_stream << m << "\n";
		s_stream << s << "\n";
		eb->insertLine( str );

		for(int i = 0; i < 1000; i++){       // 1000行出力
			eb->insertLine( tr("B") );
		}

	}else{
		eb->insertLine( "Rcv : Qcop Message" );
		eb->insertLine( m );

		if( d.size() != 0 ){
			QDataStream d_stream(d, IO_ReadOnly);
			QString s, str;
			d_stream >> s;
			QTextOStream s_stream(&str);
			s_stream << s << "\n";
			eb->insertLine( str );
		}
	}
}