我正在开发一个嵌入式应用程序,通过命令界面控制设备.我嘲笑VC中的指挥调度员,让我满意; 但是当我将代码移到嵌入式环境中时,我发现编译器的指针到func的实现方式已经破碎了.
这是我最初实现代码的方式(在VC中):
/* Relevant parts of header file */
typedef struct command {
const char *code;
void *set_dispatcher;
void *get_dispatcher;
const char *_description;
} command_t;
#define COMMAND_ENTRY(label,dispatcher,description) {(const char*)label, &set_##dispatcher, &get_##dispatcher, (const char*)description}
/* Dispatcher data structure in the C file */
const command_t commands[] = {
COMMAND_ENTRY("DH", Dhcp, "DHCP (0=off, 1=on)"),
COMMAND_ENTRY("IP", Ip, "IP Address (192.168.1.205)"),
COMMAND_ENTRY("SM", Subnet, "Subunet Mask (255.255.255.0)"),
COMMAND_ENTRY("DR", DefaultRoute, "Default router (192.168.1.1)"),
COMMAND_ENTRY("UN", Username, "Web username"),
COMMAND_ENTRY("PW", Password, "Web password"),
...
}
/* After …Run Code Online (Sandbox Code Playgroud) 在我的WPF应用程序中,我有一个长时间运行的上传,它会引发进度事件,因为它会更新进度条.用户还有机会取消上传,否则可能会出错.这些都是异步事件,因此需要使用Dispatcher.Invoke执行它们以更新UI.
所以代码看起来像这样,ish:
void OnCancelButtonClicked(object sender, EventArgs e)
{
upload.Cancel();
_cancelled = true;
view.Close();
view.Dispose();
}
void OnProgressReceived(object sender, EventArgs<double> e)
{
Dispatcher.Invoke(() =>
{
if (!cancelled)
view.Progress = e.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
假设在处理视图上设置view.Progress会抛出错误,这个代码线程是否安全?即,如果用户在进度更新时单击取消,则他/她将不得不等待进度更新,如果在执行OnCancelButtonClicked期间更新进度,则Dispatcher.Invoke调用将导致view.Progress更新到在_cancelled设置后排队,所以我不会在那里遇到问题.
或者我需要锁才能安全,la:
object myLock = new object();
void OnCancelButtonClicked(object sender, EventArgs e)
{
lock(myLock)
{
upload.Cancel();
_cancelled = true;
view.Close();
view.Dispose();
}
}
void OnProgressReceived(object sender, EventArgs<double> e)
{
Dispatcher.Invoke(() =>
{
lock(myLock)
{
if (!cancelled)
view.Progress = e.Value;
}
}
}
Run Code Online (Sandbox Code Playgroud) 有谁知道如何解决这个问题?
03-23 13:03:20.585: WARN/googleanalytics(3430): Problem with socket or streams.
03-23 13:03:20.585: WARN/googleanalytics(3430): java.net.SocketException: Broken pipe
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:87)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:94)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:168)
03-23 13:03:20.585: WARN/googleanalytics(3430): at org.apache.http.impl.AbstractHttpClientConnection.flush(AbstractHttpClientConnection.java:173)
03-23 13:03:20.585: WARN/googleanalytics(3430): at com.google.android.apps.analytics.PipelinedRequester.sendRequests(Unknown Source)
03-23 13:03:20.585: WARN/googleanalytics(3430): at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.dispatchSomePendingEvents(Unknown Source)
03-23 13:03:20.585: WARN/googleanalytics(3430): at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.run(Unknown Source)
03-23 13:03:20.585: WARN/googleanalytics(3430): at android.os.Handler.handleCallback(Handler.java:587)
03-23 …Run Code Online (Sandbox Code Playgroud) 我试图从几个不同的线程调用Dispatcher.PushFrame()但遇到错误:
必须在与DependencyObject相同的Thread上创建DependencySource.
这是一段代码:
_lockFrame = new DispatcherFrame(true);
Dispatcher.PushFrame(_lockFrame);
Run Code Online (Sandbox Code Playgroud)
当我尝试:
Dispatcher.CurrentDispatcher.Invoke(
DispatcherPriority.Normal,
new Action(() => _lockFrame = new DispatcherFrame(true));
Dispatcher.PushFrame(_lockFrame);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
对象必须由同一个线程创建.
从不同的线程将多个帧推入Dispatcher的方法是什么?
我正在尝试从网站加载新闻列表,所以首先我请求获取新闻(使用缩略图),并使用绑定功能,我将Fetched新闻分配到我的列表框,其中包含图像(的ImageUrl).
<ListBox Name="lstNews">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,12,12" Width="180" Height="180">
<Grid.Background>
<ImageBrush ImageSource="{Binding ImageUrl}" />
</Grid.Background>
<StackPanel Background="#AA000000" VerticalAlignment="Bottom" Height="60" >
<TextBlock TextWrapping="Wrap" VerticalAlignment="Bottom" TextAlignment="Center" Text="{Binding Title}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
它工作正常,但UI冻结,直到图像出现.我该如何解决这个问题?
我的环境是eclipse indigo,我正在尝试添加自定义调度程序.
import akka.actor.Actor
import akka.actor.ActorRef
import akka.dispatch.MessageDispatcher
import akka.dispatch._
import akka.event.Logging
import akka.actor.ActorSystem
import akka.actor.Props
import akka.dispatch;
class MyActor extends Actor {
Console.println("World!");
val log = Logging(context.system, this)
def receive = {
case "test" => log.info("received test")
case _ => log.info("received unknown message")
}
}
object Main extends App {
val system = ActorSystem("MySystem")
Console.println("Hello");
val myActor = system.actorOf(Props[MyActor].withDispatcher("my-dispatcher"), name = "myactor")
}
Run Code Online (Sandbox Code Playgroud)
我正在关注这个例子.http://doc.akka.io/docs/akka/2.0.2/scala/dispatchers.html
我已经尝试将它添加到akka-2.0.2/config/application.config中的application.config
我正在使用MVVM设计模式编写WPF应用程序.我想知道最好的(读"MVVM投诉")这样做的方式.另请注意,我的视图模型中的所有代码都不在UI线程上运行.目前我正在使用VM访问调度程序App.Current.Dispatcher,然后调用MessageBox.Show()它.
我有一个WPF应用程序需要处理许多小任务.这些小任务都是同时生成的,并添加到Dispatcher Queue中,优先级为Normal.同时显示忙碌指示符.结果是,尽管工作被分解为任务,但忙碌指示器实际上已冻结.
我尝试将这些任务的优先级更改为后台以查看是否已修复它,但仍然忙碌的指示器冻结.
我订阅了该Dispatcher.Hooks.OperationStarted事件,以查看在我的任务处理过程中是否发生了任何渲染作业,但他们没有.
有什么想法发生了什么?
一些技术细节:任务实际上只是来自Observable序列的消息,它们通过调用ReactiveUI来"排队"到调度程序中,ObserveOn(RxApp.MainThreadScheduler)它应该等同于ObserveOn(DispatcherScheduler).这些任务中的每一个的工作部分是通过ObserveOn调用订阅的代码,例如
IObservable<TaskMessage> incomingTasks;
incomingTasks.ObserveOn(RxApp.MainThreadScheduler).Subscribe(SomeMethodWhichDoesWork);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,incomingTasks会连续产生3000多条消息,ObserveOn将每次调用SomeMethodWhichDoesWork推送到Dispatcher队列,以便稍后处理
我得到Cannot convert lambda expression to type 'System.Delegate'错误的同时:
this.Dispatcher.Invoke((Delegate)(() =>
{
this.Focus();
if (!moveFocus)
return;
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}), DispatcherPriority.Background, new object[0]);
Run Code Online (Sandbox Code Playgroud)
我查阅了有关它的所有帖子,但我无法弄清楚/明白为什么?并且答案也没有解决我的问题.
而不是在后台工作 - 这段代码仍然冻结我的程序:
private void button_Click(object sender, RoutedEventArgs e)
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
Thread.Sleep(5000);
label.Content = "Done";
}), DispatcherPriority.Normal);
}
Run Code Online (Sandbox Code Playgroud)
我试过Thread/Tasks,线程示例:
private void button_Click(object sender, RoutedEventArgs e)
{
var t = new Thread(new ThreadStart(runtask));
t.Start();
}
private void runtask()
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
Thread.Sleep(5000);
label.Content = "Done";
}), DispatcherPriority.Normal);
}
Run Code Online (Sandbox Code Playgroud)
任务示例:
private void button_Click(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
Thread.Sleep(5000);
label.Content = "Done";
}));
});
}
Run Code Online (Sandbox Code Playgroud)
我的节目仍然冻结.有什么建议?