【问题标题】:Mac OS Cocoa application to stress the CPUMac OS Cocoa 应用程序对 CPU 施加压力
【发布时间】:2020-03-26 06:41:33
【问题描述】:

我正在尝试构建一个具有 2 个按钮(开始和停止)的 UI 应用程序。

点击开始按钮应该运行终端命令:

yes > /dev/null & yes > /dev/null & yes > /dev/null &

停止按钮应该运行:

killall yes

我也想知道该应用程序是否可以在每个 Mac OS 上运行。


我的代码

import Cocoa

@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    func applicationDidFinishLaunching(_ aNotification: Notification) {

    }

    func applicationWillTerminate(_ aNotification: Notification) {

    }

    @IBAction func StartStress(_ sender: NSButton) {

        let path = "/varun-kaddichha$/Desktop/MacStressTest/stress.sh"
        let arguments = ["/varun-kaddichha$/Desktop/MacStressTest/stress.sh"]
        sender.isEnabled = false
        let task = Process.launchedProcess(launchPath: path, arguments: arguments)
        task.waitUntilExit()
        sender.isEnabled = true
    }

}

我的 bash 文件

#! /bin/bash

do shell script "yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null & yes > /dev/null & "

【问题讨论】:

  • 问题是什么?

标签: swift xcode macos cocoa


【解决方案1】:

如果您的目标只是将单个 CPU 内核提高到 100%,同时保持 UI 响应,那么最好使用 libdispatch 在后台线程上运行无限 while 循环,如下面的 sn- p:

var stressWork: DispatchWorkItem?

@IBAction func startStress(_ sender: Any?) {
    stressWork = DispatchWorkItem(block: {
        while self.stressWork?.isCancelled == false {}
    })
    DispatchQueue.global().async(execute: stressWork!)
}

@IBAction func stopStress(_ sender: Any?) {
    self.stressWork?.cancel()
}

使用 NSTask 运行 shell 脚本将很难部署。您必须确保分发脚本,并且您将面临与沙盒相关的挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2013-01-30
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多