标签: dispatcher

如果编译器对指针到函数的支持被破坏,我该如何编写调度程序?

我正在开发一个嵌入式应用程序,通过命令界面控制设备.我嘲笑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)

c function-pointers dispatcher

1
推荐指数
1
解决办法
2244
查看次数

使用dispatcher.Invoke使我的线程安全吗?

在我的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)

wpf dispatcher thread-safety

1
推荐指数
1
解决办法
4198
查看次数

Google Analytics for Android存在问题:"Dispatcher认为已完成,但有543个失败事件"

有谁知道如何解决这个问题?

    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)

android google-analytics exception dispatcher

1
推荐指数
1
解决办法
2474
查看次数

WPF - Dispatcher PushFrame()

我试图从几个不同的线程调用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的方法是什么?

wpf multithreading dispatcher

1
推荐指数
1
解决办法
5779
查看次数

从URL加载图像会冻结Windows手机上的UI

我正在尝试从网站加载新闻列表,所以首先我请求获取新闻(使用缩略图),并使用绑定功能,我将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冻结,直到图像出现.我该如何解决这个问题?

url asynchronous dispatcher windows-phone-7

1
推荐指数
1
解决办法
1699
查看次数

添加到Akka的配置文件

我的环境是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

scala config dispatcher akka

1
推荐指数
1
解决办法
2423
查看次数

如何在WPF中从ViewModel处理MessageBox.Show

我正在使用MVVM设计模式编写WPF应用程序.我想知道最好的(读"MVVM投诉")这样做的方式.另请注意,我的视图模型中的所有代码都不在UI线程上运行.目前我正在使用VM访问调度程序App.Current.Dispatcher,然后调用MessageBox.Show()它.

.net c# wpf dispatcher mvvm

1
推荐指数
1
解决办法
2627
查看次数

处理大量小任务并保持UI响应

我有一个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队列,以便稍后处理

wpf dispatcher system.reactive reactiveui

1
推荐指数
1
解决办法
1392
查看次数

在Invoke时无法将lambda表达式转换为'System.Delegate'类型

我得到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)

我查阅了有关它的所有帖子,但我无法弄清楚/明白为什么?并且答案也没有解决我的问题.

c# invoke dispatcher

1
推荐指数
1
解决办法
3966
查看次数

WPF Dispatcher Thread Freeze主窗口

而不是在后台工作 - 这段代码仍然冻结我的程序:

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)

我的节目仍然冻结.有什么建议?

c# wpf multithreading task dispatcher

1
推荐指数
1
解决办法
1675
查看次数