Ios 超高优先级背景工作或石英精度

Ios 超高优先级背景工作或石英精度,ios,objective-c,multithreading,background,thread-priority,Ios,Objective C,Multithreading,Background,Thread Priority,我正在尝试为我的内部工作构建iOS应用程序。这个应用程序是简单的midi音序器。 这个应用程序现在所做的就是在同一台iPad上向“网络会话”发送简单的midi消息-这个会话人们称为“虚拟midi”,对不起,我不知道正确的名称是什么-但这没关系,这部分对我来说很好,后台应用程序(如animoog、ThumbJam等)可以很好地接收这些消息 唯一的主要问题是我面临的问题当我在循环中发送midi音符时(大约1/8,1/16,无所谓),当应用程序进入后台时(当我按下home按钮时),当我在其他应用程序中

我正在尝试为我的内部工作构建iOS应用程序。这个应用程序是简单的midi音序器。 这个应用程序现在所做的就是在同一台iPad上向“网络会话”发送简单的midi消息-这个会话人们称为“虚拟midi”,对不起,我不知道正确的名称是什么-但这没关系,这部分对我来说很好,后台应用程序(如animoog、ThumbJam等)可以很好地接收这些消息

唯一的主要问题是我面临的问题当我在循环中发送midi音符时(大约1/8,1/16,无所谓),当应用程序进入后台时(当我按下home按钮时),当我在其他应用程序中旅行时,如Mail、Safari或在animoog中做一些事情时,每次都是拖拉/拖拉。,会延迟工作。例如,“基因组Midi Sequencer”-当我在邮件、Safari或其他应用程序中旅行和做一些事情时不拖拉-换句话说,即使任何当前应用程序占用了CPU中的所有资源-基因组Midi Sequencer仍然发送Midi消息,没有任何延迟。为什么?

我如何构建相同的超高优先级NSThread?,即使我打开了其他应用程序并加载了CPU,它也会毫不延迟地工作?我注意到,当“基因组”应用程序发送midi时,我滚动或触摸收件箱中的信件,然后邮寄应用程序——这是正确的,因为iOS将基因组放在最优先的位置我想要同样的。

以下是我发送midi消息的方式:

我在循环中发送Midi音符。所以它听起来像Dm,Dm,Dm,Dm…每个1/8。重要的是,他们之间没有时间上的差距/延迟但它有一段时间会延迟。

  • 主高优先级NSThread

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(midiTimerTickTick) object:nil];
            [thread setThreadPriority:1];
            [thread start];
            [thread release];
    
  • 方法创建的线程

    -(void) midiTimerTickTick{
        uint64_t nextTime = mach_absolute_time();
        uint64_t timerInterval = 1000*1000*8;
        while (true){
            if(mach_absolute_time() >= nextTime)
            {
                //do work
                [self sendMidiMessage]; //Here piano playing
    
                //++
                nextTime+=timerInterval;
            }
        }        
    }
    
  • 在AppDelegate.m文件中

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
            [application endBackgroundTask:bgTask]; //Tell the system that we are done with the tasks
            bgTask = UIBackgroundTaskInvalid; //Set the task to be invalid
            //System will be shutting down the app at any point in time now
        }];
    }
    

  • 首先,我会查看迈克尔·泰森的博客,了解一些基本的时间信息。您当前的方法效率非常低,并且会无缘无故地占用大量cpu周期。本质上,CPU一直在高优先级线程上进行比较,这不是一个好主意


    解决问题的最好方法是深入研究核心音频。如果你的应用程序在前台或后台,这将允许你实时安排你的样本,但是,学习确实需要一些时间。要想快速完成您想做的事情,一个很好的方法是运行同样由Michael构建的,但对快速启动和运行核心音频有很好的支持。

    首先,我要查看Michael Tyson的博客,了解一些基本的计时信息。您当前的方法效率非常低,并且会无缘无故地占用大量cpu周期。本质上,CPU一直在高优先级线程上进行比较,这不是一个好主意


    解决问题的最好方法是深入研究核心音频。如果你的应用程序在前台或后台,这将允许你实时安排你的样本,但是,学习确实需要一些时间。要快速完成您想做的事情,一个很好的方法是运行,它也是由Michael构建的,但对快速启动和运行核心音频有很好的支持。

    感谢您的回复,我试图找到任何核心音频示例,但没有找到(我不明白如何创建一个核心音频线程并放入我的midi代码。更新的++Brett你是我的保护程序!我刚刚尝试过,“惊人的音频引擎”正是我想要的!我从示例中创建了一个调度程序。还有SendMidi()我添加了一个时间戳,现在它可以毫不延迟地工作。再次感谢您!感谢您的回复,我试图找到任何核心音频示例,但没有找到(我不知道如何创建核心音频线程并放入我的midi代码。更新的++Brett你是我的保护程序!我刚刚尝试了“惊人的音频引擎”这正是我想要的库!我根据示例创建了一个调度程序。我还在SendMidi()中添加了一个时间戳,现在它可以毫不延迟地工作。再次感谢!