我花了一整天的时间试图让我的应用程序使用线程,但没有运气.我已经阅读了很多关于它的文档,我仍然会遇到很多错误,所以我希望你能帮助我.
我有一个耗时的方法,它调用数据库并更新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) 我对高估/低估这些术语感到困惑.我完全了解A*算法是如何工作的,但我不确定具有高估或低估的启发式算法的效果.
当你采用直接鸟瞰线的平方时,是否会被高估?为什么它会使算法不正确?所有节点都使用相同的启发式方法.
当你采用直接鸟瞰线的平方根时会被低估吗?为什么算法仍然正确?
我找不到一篇解释得很好而且清晰的文章,所以我希望这里的人有一个很好的描述.
我正在尝试使用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) 我想第一次使用期货.你可以取消一份工作似乎很聪明,但它没有按预期工作.在下面的示例中,仅取消第一个作业.其余的都完成了.我误解了期货的使用吗?
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) 我经常处于这样一种情况:我有一种方法会出现问题但是例外情况不适合使用,因为它并不例外.
例如:
我正在设计一个垄断游戏.类银行有一个方法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) 问题:
设G =(V,E)是n> = 3个具有m个边的顶点的有向图.顶点集V包括三个特殊顶点a,v和b.如果存在,则通过v找到从a到b的简单路径.(简单路径是没有重复顶点的路径.)
我相信这个问题应该/可以通过Max Flow算法解决,但我不知道如何.它让我想起了Max Flow算法,它有多个源,边缘有容量1.任何人都知道如何将问题简化为最大流量算法?
如果我将顶点b设置为接收器,我无法确定它是否包含v.如果我将v设置为接收器,当达到v时如何继续?
是否有一种好的(简单的)方法可以使JCombobox看起来像JTextField?我的意思是不应该有一个下拉按钮,但是当用户输入内容时它应该显示多个结果.
谷歌,YouTube,Facebook等基本相同的方式工作.
我的班级有一个事件:
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库.此代码仅用于此项目.我喜欢惯例,但是当我说在这个例子中它没有意义或者我没有理解某些东西时,我是对的吗?
当我使用以下代码时,它可以工作,因为我使用的是 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 的功能。
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)
工作没有任何问题.任何简单的解决方案或尝试的事情?