我正在Ruby中为我的工作编写一个作业调度应用程序(主要是在给定频率下使用各种协议移动文件)
我的主循环看起来像这样:
while true do
# some code to launch the proper job
sleep CONFIG["interval"]
end
Run Code Online (Sandbox Code Playgroud)
它的工作就像一个魅力,但我不确定它是否足够安全,因为应用程序可能在运行cpu密集型软件的服务器上运行.
还有另一种方法可以做同样的事情,或者sleep()在我的情况下是否足够安全?
我想创建一个可以在任何应用程序上方打开的活动.
通常情况下,即使活动设置为对话框,当您切换到我的应用程序时,您会看到我的应用程序,并在后台看到启动器:

但是,我希望应用程序将超越任何这样的应用程序:(在photoshop中制作):

我确实看到了这个问题创建系统覆盖窗口(总是在顶部),但在ICS中,布局没有功能.此外,我想从我的应用程序给出一个对话框,而不会最小化其他应用程序...
我正在寻找一些方法让我的应用程序在特定时间播放声音,而它在后台(IOS4多任务处理).目前,我使用本地通知,效果很好,除了:
我看到有setKeepAliveTimeout:handler:但它只适用于voip-apps,因为这不是我的应用程序的目的,我想Apple会因此拒绝它.我还看到了一个解决方案,其中一直播放"空"声,直到达到时间为止,但是 - 忽略这不是一种非常优雅的方式,无论如何 - 我读到这也可能会让应用被拒绝.
由于有一些闹钟应用程序正在寻找我正在寻找的东西,我想知道他们是如何实现这个功能的.
感谢任何提前提示!
我在找到如何在C#中取消此任务时遇到了一些问题.我对处理线程没有很强的理解,我尝试使用谷歌搜索一些简单的代码示例来帮助我,但我真的没有在哪里.这是我正在处理的一段代码:
var tasks = urls.Select(url => Task.Factory.StartNew(
state =>
{
using (var client = new WebClient())
{
lock (this)
{
// code to download stuff from URL
}
}
}, url)).ToArray();
try
{
Task.WaitAll(tasks);
}
catch (Exception e)
{
textBox2.AppendText("Error: " + e.ToString());
}
Run Code Online (Sandbox Code Playgroud)
其中"urls"是一个URL数组.是否有一种简单的方法可以使我在单击程序中的按钮时完全停止下载URL?另外,我粘贴的代码片段在backgroundWorker1调用的函数中,我想这可能会使事情变得复杂一些.(我有一个backgroundWorker的原因是UI在下载URL时没有锁定.)
如果这有点令人困惑,这里是我试图用我的代码实现的概述:
提前致谢.
我有一个有两个方法的类,Load()和Process().我希望能够将这些单独作为后台任务或按顺序运行.我喜欢ContinueWith()语法,但我无法让它工作.我必须在我继续的方法上获取一个Task参数,并且在初始方法上不能有Task参数.
我想在没有lambda表达式的情况下做到这一点,但我是不是使用它们,强制在其中一个方法上创建任务参数,或者创建第三个方法LoadAndProcess()?
void Run()
{
// doesn't work, but I'd like to do it
//Task.Factory.StartNew(MethodNoArguments).ContinueWith(MethodNoArguments);
Console.WriteLine("ContinueWith");
Task.Factory.StartNew(MethodNoArguments).ContinueWith(MethodWithTaskArgument).Wait();
Console.WriteLine("Lambda");
Task.Factory.StartNew(() => { MethodNoArguments(); MethodNoArguments(); }).Wait();
Console.WriteLine("ContinueWith Lambda");
Task.Factory.StartNew(MethodNoArguments).ContinueWith(x => {
MethodNoArguments();
}).Wait();
}
void MethodNoArguments()
{
Console.WriteLine("MethodNoArguments()");
}
void MethodWithTaskArgument(Task t = null)
{
Console.WriteLine("MethodWithTaskArgument()");
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试让我的音频应用在后台播放.到目前为止,我在info.plist中将"app播放音频"添加到"所需的背景模式",并在启动声音生成器之前添加了以下代码:
AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, &interruptionListener, sgD);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, &routeChangeListener, sgD);
// select "Playback" audio session category
NSError *setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
OSStatus propertySetError = 0;
UInt32 category = kAudioSessionCategory_MediaPlayback;
propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_AudioCategory, sizeof (category), &category );
AudioSessionSetActive(true);
Run Code Online (Sandbox Code Playgroud)
但是,这仅在我切换到另一个应用程序或iPod的主屏幕时才有效.当我关闭屏幕时,它也会关闭我的音频输出,这绝对不是我想要的.但是,有关stackoverflow问题的所有教程/文档/答案似乎都表明,当您获得背景音频时,屏幕关闭时保持音频运行会自动出现.有人对我有暗示吗?非常感谢提前!弗里茨
applicationDidEnterBackground以前是否总是applicationWillTerminate在iOS应用程序中调用?我知道applicationWillTerminate并不总是被称为(多任务处理) - 但是当它被调用时,applicationDidEnterBackground总是先调用吗?对于支持多任务处理的应用程序,applicationWillTerminate如果代码已经包含在内applicationDidEnterBackground,我不想不必要地重复代码.
好的,我的问题.我想在一定数量之前启动线程.让我们说100.因此它将开始启动线程并连续检查正在运行的线程数.当达到最大数量时,它将停止启动新线程.但是通过适当的检查间隔或完成的线程将发出信号并且它将启动新线程.
通过这种方式,我将始终拥有一定数量的运行线程.
我通过使用睡眠和永久性来管理这个.所以我一直用给定的间隔检查总运行线程数,如果线程完成,请将其丢弃并重新开始.
但我的解决方案并不是让我成为一种正确的方式.我想如果完成的线程发出信号然后检查器会在最大线程数阈值以下时启动新的线程会更好.
我看到了很多线程池示例,但大多数都不包含任何排队的池,并且运行线程数量最多.我的意思是,他们只是继续启动线程,直到完成.但是让我说我有500k的网址可以收获.我不能在带有线程池的for循环中启动所有这些.
平台是c#4.5 WPF应用程序
以下是我的解决方案.其实我正在寻找一个更好的.没有改善这个.
private void Button_Click_4(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
startCrawler();
});
}
void startCrawler()
{
int irMaximumThreadcount = 100;
List<Task> lstStartedThreads = new List<Task>();
while (true)
{
for (int i = 0; i < lstStartedThreads.Count; i++)
{
if (lstStartedThreads[i].IsCompleted == true)
{
lstStartedThreads[i].Dispose();
lstStartedThreads.RemoveAt(i);
}
}
if (lstStartedThreads.Count < irMaximumThreadcount)
{
var vrTask = Task.Factory.StartNew(() =>
{
func_myTask();
});
lstStartedThreads.Add(vrTask);
}
System.Threading.Thread.Sleep(50);
}
}
void func_myTask()
{
}
Run Code Online (Sandbox Code Playgroud) 在 iOS 7 中,当应用程序不在最前面时,应用程序支持后台获取模式来获取数据:
在方便时,系统会在后台启动或恢复应用程序,并为其提供少量时间来下载任何新内容。
我的问题是:后台提取代码多久执行一次?
如果我设置最小间隔:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:10];
Run Code Online (Sandbox Code Playgroud)
它是每 10 秒执行一次,还是每天执行一次?一般来说,我应该期待什么样的间隔?
我想知道是否有可能在Linux上的用户空间中的单个进程中实现本机代码的抢占式多任务处理.(也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用.)我以为这可以使用信号来完成处理器SIGALRM和*context()家庭,但事实证明,整个*context()家庭是异步信号不安全的,所以不能保证方法的工作.我确实发现了一个实现这个想法的要点,所以显然它确实在Linux上运行,至少有时候,即使POSIX也不需要工作.gist将其作为信号处理程序安装SIGALRM,进行多次*context()调用:
void
timer_interrupt(int j, siginfo_t *si, void *old_context)
{
/* Create new scheduler context */
getcontext(&signal_context);
signal_context.uc_stack.ss_sp = signal_stack;
signal_context.uc_stack.ss_size = STACKSIZE;
signal_context.uc_stack.ss_flags = 0;
sigemptyset(&signal_context.uc_sigmask);
makecontext(&signal_context, scheduler, 1);
/* save running thread, jump to scheduler */
swapcontext(cur_context,&signal_context);
}
Run Code Online (Sandbox Code Playgroud)
Linux是否提供使这种方法正确的保证?有没有办法使这个正确吗?是否有完全不同的方法正确地做到这一点?
(通过"在用户空间中实现"我并不是说我们永远不会进入内核.我的意思是与内核实现的抢先式多任务进行对比.)
multitasking ×10
c# ×3
ios ×3
audio ×2
background ×2
android ×1
asynchronous ×1
c ×1
dialog ×1
ios4 ×1
ios7 ×1
iphone ×1
java ×1
lifecycle ×1
linux ×1
preemption ×1
ruby ×1
signals ×1
task ×1
threadpool ×1
wpf ×1