C++ (Qt)
//------  aabstractagent.cpp --------------
#include "aabstractagent.h"
#include "aabstracttransport.h"
 
AAbstractAgent::AAbstractAgent(QObject *parent)
	: QThread(parent),running(false)
{
}
 
AAbstractAgent::~AAbstractAgent()
{
	running=false;
	wait();
}
 
AAbstractTransport & AAbstractAgent::getTransport(){
	return *transport;
}
void setTransport(AAbstractTransport* value){
}
 
QTime AAbstractAgent::promoteTime(int step ){
	paramManager.promoteTime(currentTime);	
	currentTime.addSecs(step);
	if(currentTime > paramManager.getHorizont())
		exec();	
 
	return currentTime;
}
 
void AAbstractAgent::sendNewState(QString paramName){
 
}
 
QTime AAbstractAgent::getCurrentTime(){
	return currentTime;
}
 
void AAbstractAgent::changedHorizont(QTime){
	if(currentTime < paramManager.getHorizont())
		QThread::quit();
}
 
void AAbstractAgent::run(){
	while(running)
	{
		sleep(1);
		body();
	}
 
}
 
void AAbstractAgent::stop(){
	QThread::quit();
	running=false;
}
 
void AAbstractAgent::start(){
	running=true;
	QThread::start();
}
 
bool AAbstractAgent::isRunning(){
	return running;
}
 
bool AAbstractAgent::eventFilter ( QObject * watched, QEvent * event ){
	if(event->type() == QEvent::DynamicPropertyChange)
	{
		//Тут точка останова
		return QThread::eventFilter(watched,event);
	} else {
		return QThread::eventFilter(watched,event);
	}
}
 
//------  main.cpp --------------
#include <QtCore/QCoreApplication>
#include "aabstractagent.h"
class Agent: public AAbstractAgent
{
	Q_PROPERTY(int counter READ getCounter WRITE setCounter)
public:
	Agent(QObject * parent = 0):AAbstractAgent(parent){};
	~Agent(){};
	int getCounter(){return counter;};
	void setCounter(int val){
		QCoreApplication::sendEvent(this, &QEvent(QEvent::DynamicPropertyChange)); //Iavnii vizov
		counter = val;
	};
	void body(){
		//setProperty("counter", getCounter()+1); //gluboko vnutri Qt
		setCounter(getCounter()+1);
	};
private:
	int counter;
};
 
int main(int argc, char *argv[])
{
	QCoreApplication app(argc, argv);
	Agent agent1;
	Agent agent2;
	agent1.start();	
	agent2.start();
	return app.exec();
}
 
Код тестовый, не до конца допилиный и дописанный.
в приведенном коде не хватает кода установки фильтра - непонятно кто чьи события фильтрует.
Вообще говоря фильтровать события объектов из другого потока нужно очень осторожно, с использованием объектов синхронизации.
Кстати вот этот код выглядит подозрительно:
C++ (Qt)
QCoreApplication::sendEvent(this, &QEvent(QEvent::DynamicPropertyChange));
 
по идее он должен работать без проблем - вроде бы временный объект создается и передается корректно - внутри точки следования, но выглядит опасно на мой взгляд.
а по поводу ошибки в оригинальном сообщении - ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 1ef7b8. Receiver '' (of type 'AAbstractAgent') was created in thread 975aa0", file kernel\qcoreapplication.cpp, line 280
все просто - отправлять синхронное события между потоками нельзя - вместо этого нужно использовать postEvent для отправки асинхронного события.