2010-07-25 103 views
1

我想知道编写应用程序的最佳方式是什么。基本上,我有一个多线程运动模拟项目,可以同时执行不同的游戏模拟。编程一个长时间运行的基于时间的过程

我将我的匹配存储在附有DateTime的SQLite数据库中。

我想编写一个应用程序,每隔一小时左右检查一次是否需要播放任何新匹配并产生这些线程。

我不能依靠任务计划程序每小时执行一次,因为存在该进程的不同实例将共享的对象(特别是比赛对象),我怀疑在保存时会被新的进程覆盖回到DB中。所以理想情况下,我需要编写一些长时间睡眠的过程,可以在几个小时之内休息。

我写过我的对象模型,以便每个对象只从内存中加载一次,所以只要所有的仿真线程都从这个应用程序派生出来,它们就不应该覆盖数据。

编辑:上要求

更多细节基本上,多个匹配需要能够同时运行。这些匹配可以是任意长度的,所以不需要一个在另一个开始之前完成(事实上,在大多数情况下,会有多个匹配在同一时间执行)。

我想象的是一个在后台运行(我猜是服务)的程序,它睡了60分钟,然后检查数据库以查看是否应该启动任何游戏。如果有任何要开始,它会启动线程来模拟这些游戏,然后重新进入睡眠状态。因此,仿真线程正在运行,但“调度”线程又睡了60分钟。

我不能(我认为)使用默认的操作系统任务调度接口的原因是,这些需要执行的任务被剔除为一个新的进程。我已经开发了我的数据库对象模型,使得它们在第一次加载(内存引用)时被每个对象类缓存,这意味着每个对象只从内存加载一次,并且所有的保存都使用该引用。这意味着当每个仿真线程完成并保存其状态时,将使用相同的参考(更新状态)来保存状态。如果每次启动一个不同的可执行文件,大概每个进程都会打开一个不同的内存引用,因此一个进程可以保存到数据块中并覆盖另一个进程写入的状态。

服务看起来像要走的路。有没有办法让服务刚好睡60分钟,然后唤醒并执行一个函数?我觉得这是一个标准的控制台应用程序会浪费内存,但我不知道是否有一种有效的方式来做到这一点,我不知道。

+0

Linux?使用cron。不是Linux?在...处使用。内置作业功能有什么问题? – 2010-07-25 22:13:19

+0

你读过这个问题了吗?如果可执行文件不止一次启动,那么当数据保存回数据库时,数据将被稍后的过程覆盖...即,一个匹配的结果将被保存在DB中的联赛信息中覆盖。 – sohum 2010-07-25 22:24:05

+0

它是Windows,顺便说一句。 – sohum 2010-07-25 22:34:13

回答

2

如果您想使它真的可靠,请将其设为服务。

但我没有看到任何问题,使其成为一个正常的(控制台,WinForms,WPF)应用程序。

也许你可以扩大一点的要求。

+0

我在想服务可能是理想的,但我从来没有写过一个,所以我不知道如果这是设计的理想选择。 我将详细讨论问题中的要求。 – sohum 2010-07-26 00:04:20

+0

服务中很少有“魔术”。这意味着SCM可以在启动时自动启动,如果失败则重新启动。 – kyoryu 2010-07-26 00:12:57

+0

我刚刚创建了一个正常的控制台应用程序,它可以连续运行并在每次循环完成时休眠60分钟。我想没有更有效的方法来实现这一点! – sohum 2010-07-26 03:39:03

0

我不能(我认为)使用默认的操作系统任务调度接口的原因是,这些需要执行的任务被剔除为一个新的进程。我已经开发了我的数据库对象模型,使得他们被第一次加载(内存引用)的每个对象类的缓存意味着每个对象只能从内存中加载一次,即基准对所有使用节省

如果您要让所有东西永远保持缓存,那么你需要有一个永远运行的应用程序。您可以将其设置为Windows服务或正常的Windows应用程序。
Windows服务只是一个符合服务管理器API的普通exe。如果你想制作一个,Visual Studio有一个向导,可以为你自动生成一些框架代码。基本上,而不是有一个Main方法你有Service类与Run方法和其他一切都是相同的。

如果您想要,可以使用Windows任务计划程序来安排您的操作。你这样做的方式是让你的长时间运行的Windows服务在不做任何事的背景中。让它打开一个TCP套接字或命名管道或什么的,只是坐在那里。然后写一个小的“存根”exe文件,它只是连接到这个套接字或命名管道,并告诉后台应用程序唤醒。
这当然比在后台应用程序中做sleep困难得多,但它确实让您拥有更多的控制权 - 您可以在不重新启动后台服务的情况下更改睡眠时间,按需运行它,等等


然而,我会考虑你的设计。您依赖长期服务的事实是一个很大的失败点。如果你的应用需要运行几天,并且你有一个崩溃的bug,那么你必须重新开始。一个更好的体系结构是遵循Unix模型,在这个模型中,你有一些小的进程开始,做一件事,然后完成(在这种情况下,处理每个游戏模拟,因为它是自己的进程,所以如果一个人死了,它不需要主进程或其他模拟下来)。

这似乎是你试图让它长期运行的主要原因是缓存你的数据库查询。你真的需要这样做吗?很多时间数据库足够快(他们有自己的缓存,这是非常聪明的)。我见过程序员犯的一个常见错误就是假设像数据库这样的东西速度很慢,并且浪费了一堆时间来进行优化,但实际上它可能会很好