天道酬勤,学无止境

如何使用来自complicationController的sendMessage唤醒iOS父应用程序(how to wake up iOS parent app with sendMessage from complicationController)

问题

我正在尝试通过从 watchkit 扩展发送消息来唤醒 iOS 父应用程序。

这只有在从 watchApp / ViewController 调用下面的 sendMessage 函数时才有效。 当从 ComplicationController 调用它时,会发送消息,但 iOS 父应用程序现在确实会唤醒。

任何建议表示赞赏。 (请在 Swift 中引用任何代码)

这里的简化代码:

在 AppDelegate 和 ExtensionDelegate 中:

override init() {
    super.init()
    setupWatchConnectivity()
}

private func setupWatchConnectivity() {
    if WCSession.isSupported() {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

在 ExtensionDelegate 中:(这里没问题,消息发送成功)

func sendMessage(){
        let session = WCSession.defaultSession()
        let applicationData:[String:AnyObject] = ["text":"test", "badgeValue": 100 ]

        session.sendMessage(applicationData, replyHandler: {replyMessage in
            print("reply received from iphone")
            }, errorHandler: {(error ) -> Void in
                // catch any errors here
                print("no reply message from phone")
        })
    }
    print("watch sent message")

}

在 AppDelegate 中:(当 iOS 应用程序未运行/不在前台时未收到)

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    let text = message["text"] as! String
    let badgeValue = message["badgeValue"] as! Int

    dispatch_async(dispatch_get_main_queue()) { () -> Void in

        print("iphone received message from watch App")
        self.sendNotification(text, badgeValue: badgeValue)
        let applicationDict = ["wake": "nowAwake"]
        replyHandler(applicationDict as [String : String])

    }

}

这是从复杂控制器调用函数的方式(它确实发送消息但不唤醒父应用程序):

  func requestedUpdateDidBegin(){

        dispatch_async(dispatch_get_main_queue()) { () -> Void in

            let extensionDelegate = ExtensionDelegate()
            extensionDelegate.loadData()

        }
    }
回答1

主要问题是您试图在复杂数据源中包含(嵌套)异步调用。 但是,您请求的更新将到达其方法的末尾,并且实际上不会发生时间线更新(因为您没有重新加载或延长时间线,即使您这样做了,也不会及时收到新数据当前更新)。

由于没有可用于计划更新的新数据因此您必须在收到新数据执行第二次更新才能使用新数据。 执行两次背靠背更新不仅没有必要,而且会浪费更多的日常并发症预算。

Apple 建议您在更新前提前获取并缓存数据,这样复杂数据源就可以直接将请求的数据返回给复杂服务器。

数据源类的工作是尽快为 ClockKit 提供任何请求的数据。 您的数据源方法的实现应该是最少的。 不要使用您的数据源方法从网络中获取数据、计算值或执行任何可能延迟该数据交付的事情。 如果您需要为您的复杂功能获取或计算数据,请在您的 iOS 应用程序或您的 WatchKit 扩展的其他部分中执行此操作,并将数据缓存在您的复杂数据源可以访问它的位置。 您的数据源方法唯一应该做的就是获取缓存的数据并将其放入 ClockKit 所需的格式。

如何更新并发症?

  • 使用手机的后台更新将数据传输到手头,以备下次计划更新时使用。 transferUserInfoupdateApplicationContext适合这种类型的更新。

  • 使用transferCurrentComplicationUserInfo立即传输并发症数据并更新您的时间线。

这两种方法都具有只需要进行一次更新的优点。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 调用ExtensionDelegate来创建/刷新用于并发症的数据(Call ExtensionDelegate to create/refresh data for Complication)
    问题 我所有的数据创建都在ExtensionDelegate.swift完成。 问题是我的ComplicationController.swift getCurrentTimelineEntryForComplication函数之前没有调用ExtensionDelegate.swift 。 有任何想法吗? 这是我的代码和详细信息: 因此,我的ComplicationController.swift数组extEvnts为空: func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) { let extEvnts = ExtensionDelegate.evnts } 因为尚未调用我的ExtensionDelegate.swift ,所以将为数组创建数据: class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { private let session = WCSession.defaultSession() var receivedData = Array
  • 获取数据复杂化:未调用 ExtensionDelegate(Get Data to Complication: ExtensionDelegate not Called)
    问题 (看起来这个问题在前几周已经被其他人遇到了,但我还没有找到任何解决方案。) 我正在尝试做一件非常基本的事情:从我的 iOS 应用程序或我的 Watch 应用程序获取数据到我的 Complication Controller。 事实证明,我完成这件事的能力比我想象的要差得多。 watchOS 2 Transition Guide 指出我应该使用以下代码“[获取]来自扩展委托的所需数据”: ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate]; NSDictionary* data = [myDelegate.myComplicationData objectForKey:ComplicationCurrentEntry]; 伟大的。 除了,我一直无法弄清楚如何让它在扩展端工作。 尽管更重要的是,我似乎甚至无法从复杂控制器启动中运行扩展委托代码。 当我运行复杂功能时,我收到以下消息:“扩展收到唤醒复杂功能支持的请求。” 但是,任何扩展委托的方法中的代码似乎都没有运行。 我还在每个方法中设置了断点,并且没有一个断点被命中。 它看起来也像“transferCurrentComplicationUserInfo:”也被建议用于复杂功能更新,尽管目前还不清楚它是如何使用的。 据我所知
  • how to wake up iOS parent app with sendMessage from complicationController
    I am trying to wake up the iOS parent app by sending a message from watchkit extension. This though does only work when below sendMessage function is called from the watchApp / ViewController. When it is called from ComplicationController, the message is sent, but the iOS parent app does now wake up. Any advice appreciated. (please any code reference in Swift) Here the simplified code: In AppDelegate and ExtensionDelegate: override init() { super.init() setupWatchConnectivity() } private func setupWatchConnectivity() { if WCSession.isSupported() { let session = WCSession.defaultSession()
  • 结合 WatchConnectivity 和复杂功能(Combining WatchConnectivity and Complications)
    问题 我希望我的复杂功能通过 Watch Connectivity 从 iPhone 获取数据。 我正在使用sendMessage即时消息技术。 当我尝试获取数据时,我不希望我的 iPhone 应用程序打开,因此这需要在后台运行。 在我的 iPhone 上的 ViewController 中: import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { var session: WCSession! override func viewDidLoad() { super.viewDidLoad() if WCSession.isSupported() { self.session = WCSession.defaultSession() self.session.delegate = self self.session.activateSession() } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { if message
  • WatchKit Complication:从扩展委托获取并发症数据(WatchKit Complication: get Complication data from extension delegate)
    问题 我的 WatchKit 扩展中有我需要的所有数据(从 iOS 应用程序传递)。 我用WatchKit InterfaceController的数据填了一张表格,效果很好。 我试图找出在我的 WatchKit ComplicationController获取相同数据的最佳方法。 目前,在InterfaceController ,数据使用didReceiveUserInfo传入: func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { if let beachValue = userInfo["Surf"] as? String { places.append(Place(dataDictionary: ["Surf" : surfValue])) } else { print("Something went wrong") } } 我是否需要在我的ComplicationController调用这个相同的WCSession方法并再次抓取整个数据,或者有没有更简单的方法让我访问在ComplicationController使用的相同数据? 任何帮助表示赞赏。 谢谢! 编辑: 我的表功能: func makeTable() { // Per SO let
  • WatchKit2 错误代码 7007“无法访问配对设备上的会话”的真正原因是什么?(What is the very reason for WatchKit2 error code 7007 “session on paired device is not reachable”)
    问题 我正在为我的 Apple WatchOS2 应用程序开发概览视图。 我目前还没有完全理解稳定 WatchConnectivity 连接的先决条件。 我有一个奇怪的情况,在模拟器中我的 ComplicationController 可以成功发送一个 sendMessage 请求。 当我尝试看一眼时,sendMessage 请求失败: Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable." UserInfo={NSLocalizedDescription=WatchConnectivity session on paired device is not reachable. 我不得不承认,我没有在模拟器上启动我的应用程序。 但是为什么 ComplicationController 可以通信而 WatchController 不能。 我在互联网上没有找到关于错误 7007 的解释。 override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) WCSession.defaultSession().sendMessage([
  • WatchOS2 WCSession sendMessage 不会在后台唤醒 iPhone(WatchOS2 WCSession sendMessage doesn't wake iPhone on background)
    问题 这正在模拟器和真实物理设备 iphone5s 上进行测试。 我尝试使用 WCSession sendMessage 从 WatchOS2 扩展到 iPhone iOS9 代码进行通信。 当 iphone 应用程序在前台和后台模式下运行时,它运行良好。 但是如果我终止了 iPhone 应用程序(根本没有运行应用程序),那么我总是会遇到 errorHandler 超时。 因此 Watch 无法再与 iPhone 通信。 "Error Domain=WCErrorDomain Code=7012 "消息回复时间太长。" UserInfo={NSLocalizedDescription=消息回复时间太长。,NSLocalizedFailureReason=回复超时发生。}"。 我认为它应该在后台唤醒 iPhone 应用程序。 知道如何解决此问题或修复它吗? 谢谢! 回答1 在AppDelegate didFinishLaunchingWithOptions方法中激活WCSession很重要。 您还必须在那里设置WCSessionDelegate 。 如果你在其他地方这样做,当系统在后台启动被杀死的应用程序时,代码可能不会被执行。 此外,您应该通过replyHandler发送回复。 如果您尝试以其他方式发送,系统将等待永远不会到来的回复。 因此超时错误。
  • 如何从watchOS 2唤醒iPhone应用程序?(How to wake up iPhone app from watchOS 2?)
    问题 我有一个具有非常丰富的网络层的应用程序,而我的Apple Watch应用程序则取决于所有型号。 不幸的是,该应用程序的模块化程度不足,无法在手表应用程序中使用此图层。 我通过使用openParentApplication解决了此问题:唤醒iPhone应用程序,执行请求并返回结果。 在watchOS 2中,此方法已消失,我应该使用WatchConnectivity。 最好的方法是发送userInfo字典。 但是,如何唤醒iPhone应用程序来处理我的请求? 要获取有关新的userInfo的通知,我必须使用WCSessionDelegate,为此,我需要一个WCSession对象。 但是我应该何时创建呢? 以及如何唤醒应用程序? 回答1 我向苹果工程师询问了有关此问题,并获得了以下提示:iOS应用程序应在后台任务中启动。 因此,以下内容对我来说非常有效: UIApplication *application = [UIApplication sharedApplication]; __block UIBackgroundTaskIdentifier identifier = UIBackgroundTaskInvalid; dispatch_block_t endBlock = ^ { if (identifier != UIBackgroundTaskInvalid) {
  • 从挂起模式唤醒后如何打开显示器? [关闭](How to turn on monitor after wake-up from suspend mode? [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 4年前关闭。 改进这个问题 我需要将 PC 从睡眠状态唤醒以使用 C# 执行一些操作。 我使用了CreateWaitableTimer函数,一切正常。 在特定时间,PC 会唤醒,但显示器仍处于省电模式(已关闭)! 所以我想知道,唤醒后如何打开显示器? PS 我已经尝试过“关于如何打开/关闭/待机显示器的完整指南” - 使用 SendMessage (Codeproject) 和 SetThreadExecutionState(ES_DISPLAY_REQUIRED) - 它对我不起作用。 有任何想法吗? 回答1 对我来说,使用 pinvoke 调用SendMessage效果很好。 csharp 的代码示例: using System; using System.Runtime.InteropServices; namespace MyDummyNamespace { class MyProgram { private static int Main(string[] args) { // your program code here // ... NativeMethods.MonitorOff(); System.Threading.Thread
  • 电源设置关闭后如何唤醒 Windows 显示器?(How do I wake up my Windows monitors once turned off by power settings?)
    问题 所以我的 Vista 机器设置为在 10 分钟后关闭它的显示器。 (注意:机器没有暂停,或休眠) 我有一个 .Net 应用程序正在运行,它需要在指定的时间“唤醒”系统。 作为人类,您只需移动鼠标或按下一个键即可。 我如何以编程方式执行此操作? 我试过:以编程方式设置光标; 使用“发送密钥”; 甚至调用 CreateWaitableTimer 以取消挂起(即使它没有挂起),希望这会触发某些事情。 理想情况下,用 c# 编写代码会很棒,但正确的 Win API 就足够了。 提前谢谢了。 回答1 您应该能够通过发送系统命令消息来控制监视器电源,如下所示。 请注意,这是在 XP 上测试的,Vista 可能会有所改变,因此您需要对其进行测试并告诉我们。 此代码在 VB 中,但您可以看到它使用的 Win32 API 调用。 您需要将窗口句柄传递给函数,因此您的代码将需要创建一个窗口来处理消息(只需将其传递给默认的窗口处理函数)。 Const SC_MONITORPOWER As Integer = &HF170 Const WM_SYSCOMMAND As Short = &H112S Private Function SendMessage( ByVal Handle As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal
  • What is the very reason for WatchKit2 error code 7007 “session on paired device is not reachable”
    I am developing a glance view for my Apple WatchOS2 app. I'am currently didn't fully understand the prequisites for a stable WatchConnectivity connection now. I have the strange situation, that in the simulator my ComplicationController could successfully a sendMessage Request. When I try to look at my glance, the sendMessage request failed with: Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable." UserInfo={NSLocalizedDescription=WatchConnectivity session on paired device is not reachable. I have to admit, that I didn't start my app on the
  • 如何使用 WatchConnectivity 在 iOS 和 Watch 应用之间共享信息?(How can I share information between my iOS and Watch apps using WatchConnectivity?)
    问题 [免责声明:此问题旨在作为一个 wiki 问题来回答有关在watchkit和watch-os标签下在 iOS 和手表应用程序之间发送数据的常见问题。] 我正在开发 Apple Watch 应用程序,并希望在iOS应用程序与其WatchKit extension程序之间发送数据。 我查看了WatchConnectivity框架,但并不真正了解其所有方法之间的区别。 如果我希望即使我的应用程序在后台也能发送数据,我应该使用哪个函数? 我应该使用哪个函数向 Watch 发送 UI 更新? 我应该使用哪个函数来发送大数据? 回答1 在撰写此答案时( watchOS3是当前的稳定版本, watchOS4处于测试阶段), iOS应用程序与其WatchKit extension之间直接通信的唯一选择是 WatchConnectivity 框架。 (我说的很直接,因为这个问答不涉及使用CloudKit等云技术从一台设备上传文件到互联网并在另一台设备上下载。 ) 首先,我们来讨论WCSession的哪个函数应该用于什么目的。 对于代码示例,请向下滚动。 在深入研究细节之前,简要介绍每个功能以及何时使用它们: updateApplicationContext : 同步应用程序之间的状态,发送要显示在 UI 上的数据(仅用于发送小块数据) transferUserInfo : 在后台发送数据字典
  • 如何在后台唤醒我的 iPhone 应用程序以运行函数并将结果返回给 Apple Watch?(How can I awake my iPhone app in the background to run a function and return the results to Apple Watch?)
    问题 我的 Apple Watch 应用中有一个表格,其中包含来自 iPhone 应用的数据。 在 iPhone 应用程序上,我需要从互联网上获取这些数据。 在电话上,该函数称为retrieveData()。 我还有一个名为 sendToWatch() 的函数,它在手机应用程序打开时将此数据发送到手表。 我想找到一种无需打开手机应用程序即可运行retrieveData() 和sendToWatch() 的方法。 过去几个小时我一直在研究这个,它似乎非常复杂。 我已经尝试过 Apple 文档中的 openParentApp 函数,但我不知道如何设置它或如何实现它。 在过去的几个小时里,我尝试在网上搜索教程,但一切都已经过时了,而且我没有运气。 有人知道这方面的任何好的教程吗? 回答1 如您所知,您不能在 watchOS 2 中使用openParentApp 。您可以使用Watch Connectivity而不是openParentApp 。 参考 http://www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/ 下面是一个例子。 1) 从 Apple Watch 调用sendMessage方法 WCSession.defaultSession()
  • Android:Handler消息机制(四)——为什么主线程不会因Looper.loop()里的死循环卡死
    这个问题需要通过三方面来讲: 1.为什么主线程不会因为Looper.loop()里的死循环卡死? 2.为什么主线程一直在死循环却不会占用大量CPU消耗? 3.那究竟是什么导致主线程卡死? 一、为什么主线程不会因为Looper.loop()里的死循环卡死? 首先理解“线程进入死循环”这个问题, 就是在循环体内具有一段可执行的子程序,由于for(; ;)的调度导致这段子程序持续不断的在执行, 也就是持续的占用CPU资源, 从而导致当前线程的循环体外的子程序无法执行, 导致线程卡死的状态。 对于主线程既然是一段可执行的代码,也需要维持自己的执行周期,当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程绝不希望会被运行一段时间就自动退出,所以为了何保证程序能一直存活,就需要一个死循环来保证主线程一直处于运行状态,让程序处于运行阶段。 所以这个死循环可以看作是一种“假卡死”状态, 倘若这个循环体结束了意味着主线程该停止运行了, 那么app可以退出了。 那既然是死循环又如何去处理其他事务呢?会通过创建新线程的方式来完成,这里简单介绍一下,ActivityThread实际上并非线程,它不像HandlerThread类,ActivityThread并没有真正继承Thread类,只是往往运行在主线程,给人以线程的感觉,其实承载ActivityThread的主线程就是由Zygote
  • 打开父应用程序 (WatchOS 2.x+)(Open Parent Application (WatchOS 2.x+))
    问题 我正在尝试从父应用程序获取更新,但我不想在从 Apple Watch 发送请求时将父应用程序置于前台。 我最终希望将父应用程序置于后台状态,让它运行所需的方法并将其发送回手表。 具体来说,有没有办法打开父应用程序并让它临时驻留在 WatchOS 2.0+ 的后台状态? 我研究过这个: [WKInterfaceController openParentApplication:[NSDictionary new] 回复:nil]; 但这显然无法启动 Watch OS 2.0。 (父应用程序)应用程序委托: @interface InterfaceController() <WCSessionDelegate> @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *networkConnectionLabel; @end @implementation InterfaceController - (void)awakeWithContext:(id)context { [super awakeWithContext: context]; } - (void) willActivate { [super willActivate]; [self startSessionToParentDevice];
  • 在文件服务器中休眠工作线程(Sleeping a worker thread in a file server)
    问题 我正在实现一个文件服务器,它接收来自多个客户端的请求。 每个客户端发送多个请求。 在服务器端,每次有新客户端连接时,主线程都会产生一个新的工作线程来处理请求。 一个工作线程处理来自创建它的客户端的所有请求。 因此,线程在处理完一个请求后,等待来自同一客户端的另一个请求到达时被主线程唤醒。 我不确定如何实现最后一行。这就是我如何让线程进入睡眠状态并再次唤醒它。 谢谢 回答1 使用条件变量 https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 回答2 您不会“让线程休眠”。 线程在进行任何阻塞系统调用时将休眠。 有很多方法可以实现您所描述的内容,最常见的可能是“线程池模式”。 这通常使用线程安全队列来实现,而线程安全队列又可以使用互斥锁和条件变量来实现。 工作线程在等待条件变量 (pthread_cond_wait) 时将进入睡眠状态,主线程将通过向条件变量 (pthread_cond_signal) 发出信号将其唤醒。 稍微搜索一下就可以找到许多基于 pthread 的队列示例代码。 回答3 您的客户端处理线程是否为客户端保存任何状态? 如果是这样,我可以理解为什么每个客户端都需要一个专用线程。 如果是这种情况,您可以按照 Cnicutar 和其他海报的建议为每个客户端处理程序线程使用生产者-消费者队列。
  • Angular 4 - 使用 NG-IF 时出现“检查后表达式已更改”错误(Angular 4 - “Expression has changed after it was checked” error while using NG-IF)
    问题 我设置了一个service来跟踪登录的用户。 该服务返回一个 Observable 并通知所有subscribe它的组件(到目前为止只有一个组件订阅它) 。 服务: private subject = new Subject<any>(); sendMessage(message: boolean) { this.subject.next( message ); } getMessage(): Observable<any> { return this.subject.asObservable(); } Root App Component:(该组件订阅了observable) ngAfterViewInit(){ this.subscription = this._authService.getMessage().subscribe(message => { this.user = message; }); } 欢迎组件: ngOnInit() { const checkStatus = this._authService.checkUserStatus(); this._authService.sendMessage(checkStatus); } App Component Html:(这是发生错误的地方) <div *ngIf="user"><div>
  • 如何从其应用程序扩展启动父 iOS 应用程序(How to launch a parent iOS App from its App Extension)
    问题 有谁知道如何从应用扩展的视图控制器启动父应用? 我只想从其应用程序扩展启动主应用程序。 回答1 在 WWDC 会话为 iOS 和 OS X 创建扩展,第 1 部分大约 22 分钟标记说使用openURL:completionHandler:来自 UIViewController 的 extensionContext 的方法打开自定义 URL 方案 [self.extensionContext openURL:[NSURL URLWithString:@"your-app-custom-url-scheme://your-internal-url"] completionHandler:nil]; 回答2 Swift 3.1 中的工作解决方案(在 iOS10 中测试): 您需要为您的主机应用程序创建您自己的 URL Scheme ,然后将此函数添加到您的 ViewController 并使用openURL("myScheme://myIdentifier")调用它 // Function must be named exactly like this so a selector can be found by the compiler! // Anyway - it's another selector in another instance that would be
  • 为什么从 WatchKit 扩展程序向 iOS 发送消息并得到回复如此缓慢?(Why sending message from WatchKit extension to iOS and getting back a reply is so slow?)
    问题 我正在使用sendMessage方法从 WatchKit 扩展程序向 iOS 应用程序发送消息。 平均需要大约230 毫秒才能收到回复。 时间不取决于 iOS 应用程序是在屏幕上还是在后台运行。 230 毫秒大约是光在地球圆周上往返所需的时间。 但是当我测试时,手机距离我的手表 30 厘米。 问题: 为什么这么慢? 它应该这么慢吗? 有没有办法让它更快? 观察:根据我之前在 watchOS 1 中的实验,通信速度要快一些,过去大约需要 50 毫秒的往返时间。 从 WatchKit 扩展发送消息 let session = WCSession.defaultSession() session.sendMessage(["message from watch":"🌷"], replyHandler: { reply in // Getting reply from iOS app here }, errorHandler: nil) 从 iOS 应用程序接收消息 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { replyHandler(["reply from iOS"
  • 如何加入挂在阻塞IO上的线程?(How to join a thread that is hanging on blocking IO?)
    问题 我有一个在后台运行的线程正在以阻塞方式从输入设备读取事件,现在当我退出应用程序时,我想正确地清理线程,但是我不能只运行pthread_join(),因为该线程由于IO阻塞而永远不会退出。 我该如何正确解决这种情况? 我应该发送一个pthread_kill(theard,SIGIO)还是一个pthread_kill(theard,SIGALRM)来中断该块? 这两个信号是否正确? 还是有另一种方法来解决这种情况,并让该子线程退出阻塞读取? 由于我的所有谷歌搜索人员都没有找到解决方案,因此目前有些不解。 这是在Linux上并使用pthreads。 编辑:我在SIGIO和SIGALRM上玩了一些,当我不安装信号处理程序时,它们破坏了阻塞的IO,但在控制台上给出了一条消息(“可能有I / O”),但是当我安装信号处理程序,为避免出现该消息,它们不再破坏阻塞的IO,因此线程不会终止。 所以我有点回到第一步。 回答1 随着事情的发展,旧问题很可能会得到新的答案,并且现在可以使用新技术更好地处理线程中的信号。 从Linux内核2.6.22开始,系统提供了一个称为signalfd()的新功能,该功能可用于为给定的Unix信号集(完全杀死进程的信号)打开文件描述符。 // defined a set of signals sigset_t set; sigemptyset(&set)