首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同的线程中启动phonon player?

在不同的线程中启动phonon player?
EN

Stack Overflow用户
提问于 2013-02-23 06:26:36
回答 3查看 630关注 0票数 0

我有一个通过Phonon.AudioOutput连接到web源的Phonon.MediaObject。因此,当运行play()时,主图形用户界面冻结,直到播放器开始播放(最坏情况下为5秒)。

这可以通过移动播放器来修复,或者至少是它的web抓取任务。我在网上读过关于moveToThread()函数的文章,但它似乎不起作用。

我试着把它做成一个线程,但是没有成功:http://pastebin.com/1iXdQD8Y (用PyQt写的)

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 08:27:13

这将需要在您的一侧进行更多的编码。

我对python不是很了解,但从你的代码来看,我认为你犯的一个错误是假设你的PhononThread类存在于它自己的线程中,但它实际上存在于创建它的线程中。

我甚至不会尝试在线程之间移动像MediaObject这样的对象。一种方法是创建自己的QObject后代,然后在它的构造函数中创建播放音乐所需的所有对象。您还需要在类中添加插槽,以访问需要从主线程调用的每个声子函数。别忘了创建这个没有父对象的对象。然后,您需要将其移动到新创建的QThread,并在线程之间连接所有信号/插槽。

我不使用python,但下面是它应该是什么样子的伪C++大纲:

代码语言:javascript
复制
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.
};

然后在您的应用程序中执行以下操作:

代码语言:javascript
复制
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()插槽,并在需要时发出它。

票数 1
EN

Stack Overflow用户

发布于 2013-02-23 07:13:19

子类QThread,使用您希望在线程中发生的内容重新实现run(),然后创建线程的一个实例并在其上调用start()

当你连接到线程中或线程中的东西时要小心,因为你不想做直接或自动连接,在大多数情况下你想做队列连接。

此链接显示了两种使用QThread的方法,一种是我刚刚描述的,它使用moveToThread()链接到另一个生产者消费者示例。

what is the correct way to implement a QThread... (example please...)

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-03-04 20:25:15

你试过QtConcurrent::run吗?它在一个单独的线程中运行函数。

http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html#run或在此处查看https://stackoverflow.com/search?q=QtConcurrent%3A%3Arun

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15034255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档