Tag: multithreading

办公自动化与Windows 7和Office 2007挂起

我有一个Delphi XE8程序,我使用Office自动化来构build一个Excel文件。 build设需要几秒钟,所以我把这项工作放到后台线程,以便我的程序将保持响应,我可以处理取消请求。 我已经这样设置: TTask.Run( procedure var oXL, oSheet, o2Sheet, oRng, VArray : Variant; begin oXL := CreateOleObject('Excel.Application'); oXL.Visible := False; oXL.DisplayAlerts := false; … (all the processing to build the Excel file) oXL.Application.Workbooks[1].SaveAs(ExcelFilename, 51 { = xlWorkbookDefault } ); oXL.Workbooks.Close; oXL.Application.Quit; oXL := Unassigned; end ); 这个代码工作得很好,就像我想要的那样。 它创build了Excel工作簿作为后台任务,完成后从任务返回主线程,应用程序保持响应。 我以为一切都很好。 它使用Office 2016在我的Windows 10计算机上工作。我有几个用户在他们的计算机上成功运行它。 但是我有一个用户在线程中挂起程序的报告。 我能够做一些testing。 […]

如何解决“跨线程操作无效”?

我尝试启动multithreading,但我不能它返回给我错误: 跨线程操作无效:'listBox1'线程被创build来控制从另一个线程的外部访问了。 MyCodes: public DataTable dTable; public DataTable dtRowsCount; Thread t1; ThreadStart ts1; void ExcelToSql() { // SelectDataFromExcel(); ts1 = new ThreadStart(SelectDataFromExcel); t1 = new Thread(ts1); t1.Start(); } void SelectDataFromExcel() { string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Source\Addresses.xlsx;Extended Properties=""Excel 12.0;HDR=YES;"""; OleDbConnection excelConnection = new OleDbConnection(connectionString); string[] Sheets = new string[] { "Sayfa1"}; excelConnection.Open(); // This code will […]

C#任务,System.Threading.Thread.CurrentThread.CurrentCulture和Microsoft.Office.Interop.Excel

我在任务中执行代码以生成excel文件。 但单元格格式仍然是en-US格式。 任务是否获取当前线程的CurrentCulture参数? 这里有一些代码: Parallel.ForEach(_blablalist, blabla => { Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture); Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture); Dowork(blabla); } 输出: FR-FR FR-FR 这是我想要的,但excel保持在en-US格式。 也许任务有其他参数:/

从单线程进行COM调用挂起线程

我有一个应用程序,通过自动化添加进行一些Excel自动化。这个加载项是multithreading的,所有的线程pipe理调用到Excel的COM对象。 因为在进行多个调用时,excel有时可能会返回“忙”exception,所以我已将所有调用都包含在“重试”函数中。 不过,我觉得这是无益的。 我现在正试图在同一个线程上调用excel对象,这样所有的调用都被我“序列化”,从而降低了excel返回“忙”exception的风险。 但是,当此线程尝试访问Excel对象时,应用程序将挂起。 我已经尝试将线程设置为STA或MTA无济于事。 我用来从单个线程启动所有代码的代码如下:“违规”部分应该在“DoPass”中,也许我调用Delegate的方式有些不对。 public static class ExcelConnector { public static Thread _thread; private static int ticket; public static Dictionary<Delegate, int> actionsToRun = new Dictionary<Delegate, int>(); public static Dictionary<int, object> results = new Dictionary<int, object>(); static ExcelConnector() { LaunchProcess(); } public static int AddMethodToRun(Delegate method) { lock (actionsToRun) { ticket++; actionsToRun.Add(method, ticket); […]

从VBA中调用计算密集的例程而不拖延Excel GUI

我有一套数字密集的例程(每个需要1分钟才能完成)捆绑在一个COM对象中,干净地实现IDispatch 。 因此,我可以从Excel工作表中使用它们,这些例程将由button触发的VBAmacros调用。 现在,当调用这些例程之一时,Excel用户界面被冻结,这对于表单的最终用户来说是相当不舒服的。 我想find任何机制来缓解这个问题。 这可能是例如启动在COM端启动的另一个线程中的计算,立即返回,生成的线程在计算结果时callbackVBA过程。 或者更简单一些,因为我只需要一次执行一个计算。 现在,从其他线程调用VBA例程可能会有很多问题。 我必须承认,我不是那种经验丰富的COM,我只看待我的代码和Excel(我使用ATL)之间的黑盒子。 所以, 是否有可能从另一个线程callbackVBA例程? 有没有更好的方法来做我想做的事情? UPDATE 在权衡了选项并在互联网上阅读了很多东西之后,我会做一些合作的multithreading:在COM对象中,我没有一个例程,而是有三个: class CMyObject : … { … STDMETHOD(ComputationLaunch)(…); // Spawn a thread and return immediately STDMETHOD(ComputationQuery)(DOUBLE* progress, BOOL* finished); STDMETHOD(ComputationResult)(VARIANT* out); private: bool finished, progress; boost::mutex finished_lock, progress_lock; ResultObject result; // This will be marshaled to out // when calling ComputationResult }; […]