子线程启动 关闭不卡顿(子线程创建和结束的完整代码)

子线程创建和结束的完整代码

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import time


# 该 Worker 类实现了乘法运算
class Worker(QObject):
    # 定义一个信号
    on_result = pyqtSignal(float)

    def __init__(self, a, b):
        super().__init__()
        self.a = a
        self.b = b

    def run(self):
        print("开始处理(预计2秒)")

        # 模拟原本会导致UI阻塞的阻塞语句
        time.sleep(8)
        result = self.a * self.b

        # 发射信号
        self.on_result.emit(result)


class Window(QWidget):
    def __init__(self):
        super().__init__()

        l = QVBoxLayout(self)

        button = QPushButton("run")
        button.clicked.connect(self.on_button_clicked)
        l.addWidget(button)

    def on_button_clicked(self):
        # 创建 Worker 对象
        self.worker = Worker(7, 8)

        # 创建线程
        thread = QThread(self)
        self.worker.moveToThread(thread)
        self.worker.on_result.connect(self.on_worker_done)
        
        # 线程完成后退出
        self.worker.on_result.connect(lambda: thread.quit())
        
        # 启动线程
        thread.started.connect(self.worker.run)
        thread.start()

    def on_worker_done(self, value: float):
        print("我得到啦!", value)


if __name__ == "__main__":
    app = QApplication([])

    w = Window()
    w.show()

    app.exec_()

关键字:

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,可以使用 SurfaceView 来进行线程绘图,这样可以避免在主线程中执行绘图操作导致界面卡顿的情况发生。下面是一个简单的示例代码: 首先,在布局文件中添加 SurfaceView: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后,在 Activity 中获取 SurfaceView 对象,并在其上创建一个线程进行绘图: ```java public class MyActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private DrawThread mDrawThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // 获取 SurfaceView 对象和 SurfaceHolder 对象 mSurfaceView = findViewById(R.id.surfaceView); mSurfaceHolder = mSurfaceView.getHolder(); // 设置 SurfaceHolder.Callback mSurfaceHolder.addCallback(this); // 创建线程 mDrawThread = new DrawThread(mSurfaceHolder); } // SurfaceHolder.Callback 的实现 @Override public void surfaceCreated(SurfaceHolder holder) { // 启动线程 mDrawThread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // do nothing } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 停止线程 mDrawThread.stopDrawing(); } // 线程 private class DrawThread extends Thread { private SurfaceHolder mSurfaceHolder; private boolean mIsDrawing = true; public DrawThread(SurfaceHolder surfaceHolder) { mSurfaceHolder = surfaceHolder; } public void stopDrawing() { mIsDrawing = false; } @Override public void run() { while (mIsDrawing) { // 获取 Canvas 对象 Canvas canvas = mSurfaceHolder.lockCanvas(); if (canvas != null) { // 在 Canvas 上进行绘图操作 // ... // 解锁 Canvas mSurfaceHolder.unlockCanvasAndPost(canvas); } } } } } ``` 在线程中,可以通过 SurfaceHolder 的 lockCanvas() 方法获取 Canvas 对象,然后在 Canvas 上进行绘图操作,最后通过 SurfaceHolder 的 unlockCanvasAndPost() 方法将 Canvas 解锁并提交到 SurfaceView 上进行显示。注意,要在线程中不断地循环执行绘图操作,直到停止绘图的标志位被设置为 false。同时,在 SurfaceHolder.Callback 的实现中,需要在 surfaceCreated() 方法中启动线程,在 surfaceDestroyed() 方法中停止线程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值