我已经写了一个简短的模块,可以传递一个图像,只需创build一个Tkinter窗口并显示它。 我遇到的问题是,即使当我实例化并调用在单独的线程中显示图像的方法时,主程序将不会继续,直到Tkinter窗口closures。 这是我的模块: import Image, ImageTk import Tkinter class Viewer(Tkinter.Tk): def __init__(self,parent): Tkinter.Tk.__init__(self,parent) self.parent = parent self.initialize() def initialize(self): self.grid() def show(self,img): self.to_display = ImageTk.PhotoImage(img) self.label_image = Tkinter.Label(self,image=self.to_display) self.label_image.grid(column = 0, row = 0, sticky = "NSEW") self.mainloop() 它似乎工作正常,除非我从我的testing程序,如下所示调用它,它似乎不会允许我的testing程序继续,即使在不同的线程启动。 import Image from viewer import Viewer import threading def showimage(im): view = Viewer(None) view.show(im) if __name__ […]
我做了一个备份程序,我希望所有的程序备份显示在JTextArea上。 好吧,它的工作,但只有在程序完成备份后。 我该如何解决? 我运行这个代码在这里: 备份方法 public void startBackup() throws Exception { // txtarea is the JTextArea Panel.txtArea.append("Starting Backup…\n"); for (int i = 0; i < al.size(); i++) { //al is an ArrayList that holds all of the backup assignments selected // from the JFileChooser File file = new File((String) al.get(i)); File directory = new File(dir); […]
我有一个主要的程序,其中GUI是基于swing,并根据四个状态之一的GUI元素有不同的参数。 public class Frame extends JFrame implements Runnable { Status status = 1; … @Override public void run() { switch (status) { case 1: … case 2: … } public void updateGUI(Status status) { this.status = status; SwingUtilities.invokeLater(this); } 如果我想刷新GUI调用只有适当的参数的updateGUI,一切都很好。 但是程序还会创build一个额外的线程,在处理完相关的数据之后,应该更改GUI主程序。 不幸的是我不能在这个线程中调用updateGUI(..)方法。 我知道我可以使用invokeLater或SwingWorker来刷新,但有超过10个元素,所以我宁愿使用方法udpateGUI()。 我会很感激任何提示。
这是一个WinForms代码: async void Form1_Load(object sender, EventArgs e) { // on the UI thread Debug.WriteLine(new { where = "before", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread }); var tcs = new TaskCompletionSource<bool>(); this.BeginInvoke(new MethodInvoker(() => tcs.SetResult(true))); await tcs.Task.ContinueWith(t => { // still on the UI thread Debug.WriteLine(new { where = "ContinueWith", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread }); }, TaskContinuationOptions.ExecuteSynchronously).ConfigureAwait(false); // on a pool thread […]
我有一个Java程序,在一个单独的(非EDT)线程上执行一个严格的循环。 尽pipe我认为Swing UI仍然可以响应,但事实并非如此。 下面的示例程序显示了这个问题:单击“尝试我”button应该会在半秒钟后或多或less地popup一个对话框,并且应该可以通过单击任何响应来立即closures该对话框。 相反,对话框需要更长的时间才能显示,并且/或者点击其中一个button需要很长时间才能closures。 问题发生在Linux(两个不同的发行版),Windows,Raspberry Pi(仅限服务器VM)和Mac OS X(由另一个SO用户报告)上。 Java版本1.8.0_65和1.8.0_72(都尝试过) i7处理器拥有多个内核。 EDT应该有足够的备用处理能力。 有没有人知道为什么EDT处理被延迟,即使只有一个繁忙的线程? (请注意,虽然Thread.sleep调用的各种build议是造成问题的原因,但它不是,它可以被删除,问题仍然可以被复制,尽pipe它显示的频率稍低,并且通常performance出上述第二种行为- 即没有响应的JOptionPane对话框,而不是延迟的对话框外观,而且,没有任何理由让睡眠调用产生到另一个线程,因为上面提到了备用的处理器内核 ; EDT可以继续在另一个内核上运行呼叫sleep )。 import java.awt.EventQueue; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class MFrame extends JFrame { public static void main(String[] args) { EventQueue.invokeLater(() -> { new MFrame(); }); } public MFrame() { JButton tryme = new JButton("Try me!"); tryme.addActionListener((e) […]
假设我有一个N个元素的向量,但是这个向量的n个元素都有有意义的数据。 一个更新程序线程更新第n个或第n + 1个元素(然后设置n = n + 1),还检查n是否太接近于N,并在必要时调用vector :: resize(N + M)。 更新之后,线程调用多个子线程读取第n个数据并进行一些计算。 确保子线程永远不会更改或删除数据(实际上没有数据被删除),更新程序在完成更新后立即调用子线程。 到目前为止,没有发生任何问题,但是我想问一下如果在上一次更新之前还有一些子工作线程,向量重新分配给更大的内存块时是否会出现问题。 或者在这种multithreading的情况下使用向量是安全的,因为它不是线程安全的? 编辑:因为只有插入发生时更新调用vector::resize(N + M,0),有没有任何可能的解决scheme,我的问题? 由于STL向量的良好性能,我不愿意用一个可locking向量来replace它,或者在这种情况下是否有任何高性能,已知和无锁向量?
只是在这里有一个问题,我不知道如何解决。 我正在做一个涉及GUI和串行数据的小型项目。 GUI正在由主线程运行,并且由于保存我的传入串行数据的数据variables需要不断更新,所以在第二个线程中进行更新。 问题是当我需要更新GUI上的一些文本框时,需要使用辅助线程中的数据来更新这些文本框,这就是我的问题所在。 我不能直接从辅助线程更新他们,我不知道如何从我的辅助线程传输数据,并找出一个从主线程更新它们的系统。 我已经把我的代码放在下面: 任何帮助将是伟大的。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.IO; using System.IO.Ports; using System.Threading; namespace GUIBike { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow […]
我正在使用中显示的技术 WebBrowser控件在一个新的线程 尝试获取网页的屏幕截图我已经能够获得下面的代码,当WebBrowser控件放置在WinForm上成功工作。 但是,在线程中运行时,它会提供桌面的任意图像,从而失败。 Thread browserThread = new Thread(() => { WebBrowser br = new WebBrowser(); br.DocumentCompleted += webBrowser1_DocumentCompleted; br.ProgressChanged += webBrowser1_ProgressChanged; br.ScriptErrorsSuppressed = true; br.Navigate(url); Application.Run(); }); browserThread.SetApartmentState(ApartmentState.STA); browserThread.Start(); private Image TakeSnapShot(WebBrowser browser) { int width; int height; width = browser.ClientRectangle.Width; height = browser.ClientRectangle.Height; Bitmap image = new Bitmap(width, height); using (Graphics graphics = […]
那么我有一个使用std :: thread将数据传递到线程的问题。 我以为我明白了复制构造函数等的一般语义,但似乎我不太明白这个问题。 我有一个简单的类叫做Log,隐藏了它的拷贝构造函数: class Log { public: Log(const char filename[], const bool outputToConsole = false); virtual ~Log(void); //modify behavior void appendStream(std::ostream *); //commit a new message void commitStatus(const std::string str); private: //members std::ofstream fileStream; std::list<std::ostream *> listOfStreams; //disable copy constructor and assignment operator Log(const Log &); Log & operator=(const Log &); } 现在我有一个主要依靠http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp […]
我有一个简单的自定义日志框架是这样的: package something; import javafx.scene.control.TextArea; public class MyLogger { public final TextArea textArea; private boolean verboseMode = false; private boolean debugMode = false; public MyLogger(final TextArea textArea) { this.textArea = textArea; } public MyLogger setVerboseMode(boolean value) { verboseMode = value; return this; } public MyLogger setDebugMode(boolean value) { debugMode = value; return this; } public […]