小编Mad*_*sen的帖子

如何使用backgroundworker更新GUI?

我花了一整天的时间试图让我的应用程序使用线程,但没有运气.我已经阅读了很多关于它的文档,我仍然会遇到很多错误,所以我希望你能帮助我.

我有一个耗时的方法,它调用数据库并更新GUI.这必须一直发生(或大约每30秒).

public class UpdateController
{
    private UserController _userController;

    public UpdateController(LoginController loginController, UserController userController)
    {
        _userController = userController;
        loginController.LoginEvent += Update;
    }

    public void Update()
    {
        BackgroundWorker backgroundWorker = new BackgroundWorker();
        while(true)
        {
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
            backgroundWorker.RunWorkerAsync();
        }     
    }

    public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        _userController.UpdateUsersOnMap();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法我得到一个例外,因为后台工作者不是和STA线程(但从我可以理解这是我应该使用的).我试过一个STA线程,并给出了其他错误.

我认为问题是因为我在进行数据库调用时尝试更新GUI(在后台线程中).我应该只进行数据库调用,然后以某种方式它应该切换回主线程.在主线程执行后,它应该返回后台线程,依此类推.但我看不出怎么做.

应用程序应在数据库调用后立即更新GUI.Firering事件似乎不起作用.背景线程只是输入它们.

编辑:

一些非常好的答案:)这是新的代码:

public class UpdateController{
private UserController _userController;
private BackgroundWorker _backgroundWorker;

public UpdateController(LoginController loginController, UserController userController)
{
    _userController = userController;
    loginController.LoginEvent += Update;
    _backgroundWorker = new BackgroundWorker(); …
Run Code Online (Sandbox Code Playgroud)

c# wpf multithreading backgroundworker winforms

45
推荐指数
3
解决办法
8万
查看次数

A*启发式,过高估计/低估?

我对高估/低估这些术语感到困惑.我完全了解A*算法是如何工作的,但我不确定具有高估或低估的启发式算法的效果.

当你采用直接鸟瞰线的平方时,是否会被高估?为什么它会使算法不正确?所有节点都使用相同的启发式方法.

当你采用直接鸟瞰线的平方根时会被低估吗?为什么算法仍然正确?

我找不到一篇解释得很好而且清晰的文章,所以我希望这里的人有一个很好的描述.

algorithm search artificial-intelligence graph a-star

18
推荐指数
4
解决办法
2万
查看次数

最大流量 - Ford-Fulkerson:无向图

我正在尝试使用Ford-Fulkerson算法解决图的最大流问题.该算法仅用有向图描述.当图表无向时怎么办?

我模仿无向图的方法是在一对顶点之间使用两个有向边.令我困惑的是:这些边缘中的每一个是否应该有剩余边缘,或者是剩余边缘的"相对"有向边缘?

我假设了最后一个,但我的算法似乎进入了无限循环.我希望你们中的任何人能给我一些帮助.以下是我自己的实现.我正在使用DFS查找.

import sys
import fileinput

class Vertex(object):
    def __init__(self, name):
        self.name = name
        self.edges = []

    def find(self, sink, path):
        if(self == sink):
            return path
        for edge in self.edges:
            residual = edge.capacity - edge.flow
            if(residual > 0 or edge.inf):
                if(edge not in path and edge.oppositeEdge not in path):
                    toVertex = edge.toVertex
                    path.append(edge)
                    result = toVertex.find(sink, path)
                    if result != None:
                        return result

class Edge(object):
    def __init__(self, fromVertex, toVertex, capacity):
        self.fromVertex = fromVertex
        self.toVertex = toVertex
        self.capacity = capacity …
Run Code Online (Sandbox Code Playgroud)

python algorithm ford-fulkerson

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

了解未来/线程

我想第一次使用期货.你可以取消一份工作似乎很聪明,但它没有按预期工作.在下面的示例中,仅取消第一个作业.其余的都完成了.我误解了期货的使用吗?

public class ThreadExample 
{
    public static void main(String[] args) throws InterruptedException, ExecutionException 
    {
        int processors = Runtime.getRuntime().availableProcessors();
        System.out.println("Processors: " + processors);
        ExecutorService es = Executors.newFixedThreadPool(processors);
        int nowork = 10;
        Future<Integer>[] workres = new Future[nowork];
        for(int i = 0; i < nowork; i++)
        {
            workres[i] = es.submit(new SomeWork(i));
        }
        for(int i = 0; i < nowork; i++) 
        {
            if(i % 2 == 0)
            {
                System.out.println("Cancel");
                workres[i].cancel(true);
            }
            if(workres[i].isCancelled())
            {
                System.out.println(workres[i] + " is cancelled");
            }
            else
            {
                System.out.println(workres[i].get());
            }
        } …
Run Code Online (Sandbox Code Playgroud)

java multithreading future

11
推荐指数
2
解决办法
3750
查看次数

有些东西可能出错,但也不例外

我经常处于这样一种情况:我有一种方法会出现问题但是例外情况不适合使用,因为它并不例外.

例如:

我正在设计一个垄断游戏.类银行有一个方法buyHouse和一个计算剩余房屋数量的字段(垄断中有32个房屋).可能出错的是玩家在剩下0时买房子.我该怎么办呢 这是我能提出的3种方法.

1. public void buyHouse(Player player, PropertyValue propertyValue)
{
    if(houseCount < 0) throw new someException;
    ....
    //Not really an exceptional situation
}

2. public boolean buyHouse(Player player, PropertyValue propertyValue)
{
    if(houseCount < 0) return false;
    ....
    //This I think is the most normal approach but changing something
    //and returning if it was a success seems bad practice to me.
}

3. public boolean housesLeft()
{
    if(houseCount > 0) return true;

    return false;

    //Introducing a new method. But …
Run Code Online (Sandbox Code Playgroud)

java oop methods exception

10
推荐指数
2
解决办法
273
查看次数

最大流量 - 通过顶点 - 如何?

问题:

设G =(V,E)是n> = 3个具有m个边的顶点的有向图.顶点集V包括三个特殊顶点a,v和b.如果存在,则通过v找到从a到b的简单路径.(简单路径是没有重复顶点的路径.)

我相信这个问题应该/可以通过Max Flow算法解决,但我不知道如何.它让我想起了Max Flow算法,它有多个源,边缘有容量1.任何人都知道如何将问题简化为最大流量算法?

如果我将顶点b设置为接收器,我无法确定它是否包含v.如果我将v设置为接收器,当达到v时如何继续?

algorithm graph

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

如何使JCombobox看起来像JTextField

是否有一种好的(简单的)方法可以使JCombobox看起来像JTextField?我的意思是不应该有一个下拉按钮,但是当用户输入内容时它应该显示多个结果.

谷歌,YouTube,Facebook等基本相同的方式工作.

java swing

6
推荐指数
2
解决办法
6911
查看次数

事件惯例 - 我不明白

我的班级有一个事件:

public class WindowModel
{
    public delegate void WindowChangedHandler(object source, WindowTypeEventArgs e);
    public event WindowChangedHandler WindowChanged;  

    public void GotoWindow(WindowType windowType)
    {
        this.currentWindow = windowType;
        this.WindowChanged.Invoke(this, new WindowTypeEventArgs(windowType));
    }
}
Run Code Online (Sandbox Code Playgroud)

派生事件类:

public class WindowTypeEventArgs : EventArgs
{
    public readonly WindowType windowType;

    public WindowTypeEventArgs(WindowType windowType)
    {
        this.windowType = windowType;
    }
}
Run Code Online (Sandbox Code Playgroud)

其他一些将它注册到事件的类:

private void SetupEvents()
{
   this.WindowModel.WindowChanged += this.ChangeWindow;
}

private void ChangeWindow(object sender, WindowTypeEventArgs e)
{
   //change window
}
Run Code Online (Sandbox Code Playgroud)

我从遵循.Net惯例中获得了什么?签订这样的合同会更有意义

public delegate void WindowChangedHandler(WindowType windowType);
public event WindowChangedHandler WindowChanged;
Run Code Online (Sandbox Code Playgroud)

这样做,我不需要创建一个新类,更容易理解.我不是在编写.Net库.此代码仅用于此项目.我喜欢惯例,但是当我说在这个例子中它没有意义或者我没有理解某些东西时,我是对的吗?

c# events conventions

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

基于属性不适用于 ListView

当我使用以下代码时,它可以工作,因为我使用的是 ListBox

<UserControl.Resources>
    <Style BasedOn="{StaticResource {x:Type ListBox}}" TargetType="{x:Type ListBox}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="Background" Value="Transparent" />
    </Style>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

但是当我将以下代码用于 ListView 时,我收到警告/异常

<UserControl.Resources>
    <Style BasedOn="{StaticResource {x:Type ListView}}" TargetType="{x:Type ListView}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="Background" Value="Transparent" />
    </Style>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

“未找到静态资源引用 'System.Windows.Controls.ListView'。”

为什么以及如何解决?我想要 ListView 的功能。

c# wpf

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

在WPF中播放mp3

MediaElement在我的WPF应用程序中对我不起作用.

mediaElement1.LoadedBehavior = MediaState.Manual;
mediaElement1.Source = new Uri(@"C:\Music\MySong.mp3", UriKind.RelativeOrAbsolute);
mediaElement1.Play();
Run Code Online (Sandbox Code Playgroud)

当我在我的Window1.xaml.cs文件中执行此操作时.什么都没发生.至少我听不到任何声音.我尝试了各种不同的东西,但没有声音.

在winforms中:

axWindowsMediaPlayer1.URL = @"C:\Music\MySong.mp3";
axWindowsMediaPlayer1.Ctlcontrols.play();
Run Code Online (Sandbox Code Playgroud)

工作没有任何问题.任何简单的解决方案或尝试的事情?

c# audio wpf winforms

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