我有一个Phonon.MediaObject
通过Phonon.AudioOutput
. 因此,在运行时play()
,主 GUI 会冻结,直到播放器开始播放(最坏情况下为 5 秒)。
这可以通过移动播放器来解决,或者至少是网络抓取任务。我已经在网上阅读了有关moveToThread()
功能的信息,但它似乎不起作用。
我试着用它做一个线程,但没有运气:http://pastebin.com/1iXdQD8Y(用 PyQt 编写)
有任何想法吗?
我有一个Phonon.MediaObject
通过Phonon.AudioOutput
. 因此,在运行时play()
,主 GUI 会冻结,直到播放器开始播放(最坏情况下为 5 秒)。
这可以通过移动播放器来解决,或者至少是网络抓取任务。我已经在网上阅读了有关moveToThread()
功能的信息,但它似乎不起作用。
我试着用它做一个线程,但没有运气:http://pastebin.com/1iXdQD8Y(用 PyQt 编写)
有任何想法吗?
这将需要您进行更多的编码。
我不太了解python,但是通过查看您的代码,我认为您犯的一个错误是假设您的PhononThread
类生活在它自己的线程中,但实际上它生活在创建它的线程中。
我什至不会尝试MediaObject
在线程之间移动对象。一种方法是创建自己的QObject
后代,然后在它的构造函数中创建播放音乐所需的所有对象。您还需要向您的类添加插槽,以访问您需要从主线程调用的每个声子函数。请记住在没有父对象的情况下创建此对象。然后您需要将其移动到新创建的 QThread 并连接线程之间的所有信号/插槽。
我不使用 python,但这里是伪 C++ 大纲,它应该是什么样子:
class MyPlayer: public QObject{
Q_OBJECT
public:
AudioOutput* ao;
MediaObject* mo;
MyPlayer() : QObject(0) { // note no parent QObject instance
ao = new AudioOutput();
... // Create and connect all objects
}
public slots:
void setCurrentSource ( const MediaSource & source ){
mo->setCurrentSource(source);
}
// And other methods that are not slots already.
};
然后在您的应用程序中执行以下操作:
MyPlayer* mp = new MyPlayer();
QThread* th = new QThread();
connect(th, SIGNAL(finished()), mp, SLOT(deleteLater()));
connect( mainThreadObj, SIGNAL(setPlayerSource ( const MediaSource & ) ), mp, SLOT(setPlayerSource ( const MediaSource & ) ) );
... // and other signals; note that methods that are signals already can be conected witout wrappers:
connect( mainThreadObj, SIGNAL(playerPlay() ), mp->mo, SLOT(play()) );
mp->moveToThread(th);
要停止线程,只需将信号从主线程连接到quit()
插槽,并在需要时发出。
子类QThread
,run()
用你想在你的线程中发生的东西重新实现,然后创建你的线程的一个实例并调用start()
它。
当您连接到线程中或线程中的东西时要小心,因为您不想进行直接或自动连接,在大多数情况下您希望进行排队连接。
此链接显示了两种使用方式QThread
,一种如我刚刚描述的那样,它链接到另一个使用moveToThread()
.
实现 QThread 的正确方法是什么...(请举例...)
希望有帮助。
你试过QtConcurrent::run
吗?它在单独的线程中运行函数。
http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html#run 或在这里查看https://stackoverflow.com/search?q=QtConcurrent%3A%3Arun