我有一个Java应用程序,用于通过UART连接(RS422)与嵌入式设备通信.主机以5毫秒的间隔向微控制器查询数据.直到最近,我一直在使用ScheduledExecutorService scheduleAtFixedRate来调用我的通信协议方法,但事实证明scheduleAtFixedRate对于这个所需的精度水平非常不可靠(正如许多其他帖子所揭示的那样).从微控制器返回的数据是时间戳(以微秒为单位),允许我独立于JVM验证接收数据包之间的间隔.不用说,使用scheduleAtFixedRate时的间隔变化很大 - 数据包之间最多30毫秒.此外,调度程序将尝试通过在一毫秒内多次调用Runnable来过度补偿错过的周期(同样,这里的任何人都不会感到惊讶).
经过一番搜索,似乎已经达成共识,即JVM根本无法被信任以确保任何类型的精确调度.但是,我决定自己做一些实验并想出这个:
Runnable commTask = () -> {
// volatile boolean controlled from the GUI
while(deviceConnection) {
// retrieve start time
startTime = System.nanoTime();
// time since commProtocol was last called
timeDiff = startTime - previousTime;
// if at least 5 milliseconds has passed
if(timeDiff >= 5000000) {
// handle communication
commProtocol();
// store the start time for comparison
previousTime = startTime;
}
}
};
// commTask is started as follows
service = Executors.newSingleThreadScheduledExecutor();
service.schedule(commTask, 0, TimeUnit.MILLISECONDS); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用visual c ++ express 2010将vc ++项目编译为64位.我知道64位编译器没有附带vc ++ express的默认安装,所以我按照此处的指定为Windows 7安装了windows sdk(http:// msdn.microsoft.com/en-us/library/9yb4317s.aspx)其中包括我理解的64位编译器.但是,vc ++的配置管理器中仍然没有64位选项.经过一番搜索,我发现并完成了本教程(http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/)以及各种本页底部的链接.尽管我付出了很多努力,但仍然无法在vc ++中显示64位编译器.我也尝试重新安装vc ++和sdk.如果有人有任何经验/提示让这个工作,我会非常感激.fyi - 我正在运行Windows 7(x64).
正如标题所示,我遇到以下链接器错误:
错误LNK2019:未解析的外部符号"unsigned char __stdcall HidD_GetAttributes(void*,struct _HIDD_ATTRIBUTES*)"(?HidD_GetAttributes @@ YGEPAXPAU_HIDD_ATTRIBUTES @@@ Z)
result = HidD_GetAttributes(WriteHandle, &attributes)在我的代码中调用时.
此函数应存在于"hid.lib"中,我已将其添加到项目的链接器依赖项中.我还包括头文件"hidsdi.h",它具有HidD_GetAttributes的函数原型.
我认为唯一可能有问题的是"hid.lib"的函数原型分为三个不同的头文件:hidsdi.h,hidpi.h和hidsage.h.
有什么建议?
我对java比较陌生,对ActionListeners的工作方式很好奇.假设我有一个实现如下定时器的动作监听器:
class TimerActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//perform some operation
}
}
Run Code Online (Sandbox Code Playgroud)
如果将计时器设置为比我的actionlistener类中的代码运行得更快,将会发生什么.代码是否完成执行并忽略新请求,直到完成(如中断).或者对actionlistener的新调用优先于当前实例 - 这样代码永远不会完成?
我有一个java应用程序,它可以传输原始数据并相应地绘制实时图.这是通过从我编写的使用Graphics对象的类中调用方法来处理的.我在重写的paintComponent方法中实现了算法,以生成最新数据中的所有图.我在我的类中有其他方法来更新paintComponent方法中使用的变量来绘制图形.
在我的主类中,我定期在计时器事件处理程序中更新我的图形.在事件处理程序中,我从我的图形类中调用更新某些变量的方法,进行一些计算,然后调用repaint()(这显然是调用paintComponent方法的正确方法).
我的问题是,我在paintComponent方法中使用的算法可能需要(相对)长的时间来完成,具体取决于我的图的数量和分辨率.(我还没有遇到这个问题,但我现在正试图解决它).当然我不希望所有这些图形占用我的应用程序的所有处理时间,所以我想知道是否可以在单独的线程中执行"paintComponent".
如果我在我的main中创建一个子类以在一个单独的线程中运行并简单地调用我描述的图形方法会发生什么?会自动使所有这些方法(包括paintComponent)在新线程中执行吗?或者我是否必须修改我的图表类本身才能使用?理想情况下,我想避免修改我的图类,因为我已经将它设计为在NetBeans GUI构建器中作为JPanel工作,我想避免破坏该功能.
我有一个任务管理器应用程序,它在 ListView 中显示许多 TaskWidget 小部件,目前我正在尝试修改我的应用程序以使用 Provider 进行状态管理。我有一个 TaskListModel 类作为我的 ChangeNotifier,它包含一个 TaskModel 列表以及一些调用 notifyListeners() 的 getter 和 setter。(TaskModel 不是 ChangeNotifier)
当用户修改列表中单个任务的数据时,我想重建该小部件而不重建列表中的所有其他小部件。Selector 几乎做了我想要的,除了我需要访问 TaskModel 中的所有字段来重建相应的 TaskWidget,而 Selector 似乎只适用于单个字段。我已经尝试通过使用列表索引将选择器设置为 TaskModel 的实例来使用 Selector。我认为这不起作用,因为它正在侦听 TaskModel 的引用(它不会改变)而不是 TaskModel 中的所有字段。有没有一种直接的方法可以让我做到这一点?我在下面包含了 TaskWidget 的构建方法以供参考。
Widget build(BuildContext context) {
return Column(children: <Widget>[
Selector<TaskListModel, TaskModel>(
selector: (_, taskListModel) => taskListModel.taskList[index],
builder: (_, taskModel, child) {
print("rebuilding " + index.toString());
return Material(
color: taskModel.color,
child: ListTile(
title: Column(children: <Widget>[
Text(
taskModel.name,
style: _taskFont,
textAlign: TextAlign.center,
),
Text(
taskModel.formattedTime,
style: _taskFont,
textAlign: TextAlign.center, …Run Code Online (Sandbox Code Playgroud)