文档彩票走势图>>VectorDraw Developer Framework使用教程>>VDF常见问题整理(十八):关于多线程的打印问题
VDF常见问题整理(十八):关于多线程的打印问题
VectorDraw Developer Framework(VDF)是一个用于应用程序可视化的图形引擎库。有了VDF提供的功能,您可以轻松地创建、编辑、管理、输出、输入和打印2D和3D图形文件。
VectorDraw Developer Framework试用版下载
问:
有关于多线程的打印问题,应该如何解决?
答:
已改进了顺序调用vddocument不同实例的方法以在多线程项目中工作,一个线程用于每个不同的vdDocument。
Example: using System; using System.Threading; using VectorDraw.Professional.Components; using VectorDraw.Professional.vdObjects; using System.Windows.Forms; using VectorDraw.Generics;namespace MultiPrint { class Program { const string ExportExtension = ".pdf"; //const string ExportExtension = ".svg"; //const string ExportExtension = ".jpg"; //const string ExportExtension = ".emf"; //const string ExportExtension = ".bmp"; //const string ExportExtension = ".png"; //const string ExportExtension = ".HPG"; //const string ExportExtension = ".dxf"; public static bool IsPrintExportFormat { get { return (string.Compare(ExportExtension, "", true) == 0 || string.Compare(ExportExtension, ".jpg", true) == 0 || string.Compare(ExportExtension, ".pdf", true) == 0 || string.Compare(ExportExtension, ".svg", true) == 0 || string.Compare(ExportExtension, ".emf", true) == 0 || string.Compare(ExportExtension, ".HPG", true) == 0 || string.Compare(ExportExtension, ".png", true) == 0 || string.Compare(ExportExtension, ".bmp", true) == 0 ); } } [STAThread] static void Main(string[] args) { Console.BufferWidth = 180; FolderBrowserDialog folderbrowser = new FolderBrowserDialog(); folderbrowser.RootFolder = Environment.SpecialFolder.Desktop; folderbrowser.SelectedPath = Environment.CurrentDirectory; DialogResult res = folderbrowser.ShowDialog(); if (res != DialogResult.OK) return; string argument = folderbrowser.SelectedPath + @"\"; string folder = System.IO.Path.GetDirectoryName(argument); Environment.CurrentDirectory = folder; if (folder == null || folder == string.Empty || !System.IO.Directory.Exists(folder)) throw new Exception("Pass an existing folder as argument."); string[] files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.TopDirectoryOnly); vdArray<string> filenames = new vdArray<string>(); foreach (string filename in files) { if (filename.EndsWith(".vdcl", StringComparison.InvariantCultureIgnoreCase) || filename.EndsWith(".vdml", StringComparison.InvariantCultureIgnoreCase) || filename.EndsWith(".dwg", StringComparison.InvariantCultureIgnoreCase) || filename.EndsWith(".dxf", StringComparison.InvariantCultureIgnoreCase) ) { filenames.AddItem(filename); } } string message = "SelectedFiles :"; foreach (string item in filenames) { message += string.Format("\n{0}", item); } message += string.Format("\n\n Continue Exporting to {0} ?", ExportExtension); res = MessageBox.Show(message, "Selected Files", MessageBoxButtons.YesNo); if (res == DialogResult.No) return; int i = 0; foreach (string item in filenames) { BeginNewPrintJob(item, i); i++; } } static void BeginNewPrintJob(string filename, int jobid) { DocumentJob job = new DocumentJob(jobid); Thread thread = new Thread(new ParameterizedThreadStart(job.PrintFile)); thread.Name = "PrintJob : " + filename; thread.SetApartmentState(ApartmentState.MTA); thread.Start(filename); } class DocumentJob { int lineNo = 0; public DocumentJob(int jobId) { lineNo = jobId; } public void PrintFile(object Params) { string fname = Params as string; PrintMessage(string.Format("{0,-40} ", System.IO.Path.GetFileName(fname)) + "Start"); vdDocumentComponent DocComponent = new vdDocumentComponent(); vdDocument document = DocComponent.Document; document.FileName = fname; document.OnPrompt += new vdDocument.PromptEventHandler(document_OnPrompt); document.OnProgress += new VectorDraw.Professional.Utilities.ProgressEventHandler(document_OnProgress); document.GenericError += new vdDocument.GenericErrorEventHandler(document_GenericError); document.OnLoadUnknownFileName += new vdDocument.LoadUnknownFileName(document_OnLoadUnknownFileName); document.OnIsValidOpenFormat += new vdDocument.IsValidOpenFormatEventHandler(document_OnIsValidOpenFormat); document.OnSaveUnknownFileName += new vdDocument.SaveUnknownFileName(document_OnSaveUnknownFileName); document.OnGetSaveFileFilterFormat += new vdDocument.GetSaveFileFilterFormatEventHandler(document_OnGetSaveFileFilterFormat); bool success = document.Open(fname); if (success) { success = false; if (IsPrintExportFormat) { vdPrint printer = document.Model.Printer; printer.PrinterName = System.IO.Path.GetDirectoryName(fname) + @"\" + System.IO.Path.GetFileNameWithoutExtension(fname) + ExportExtension; printer.paperSize = new System.Drawing.Rectangle(0, 0, 827, 1169);//A4 printer.LandScape = false; printer.PrintExtents(); printer.PrintScaleToFit(); printer.CenterDrawingToPaper(); printer.PrintOut(); success = true; } else { if (string.Compare(ExportExtension, System.IO.Path.GetExtension(fname)) != 0) success = document.SaveAs(System.IO.Path.GetDirectoryName(fname) + @"\" + System.IO.Path.GetFileNameWithoutExtension(fname) + ExportExtension); } } if (success) PrintMessage(string.Format("{0,-40} ", System.IO.Path.GetFileName(document.FileName)) + "Finish"); else PrintMessage("Error Exporting " + fname); document.OnPrompt -= new vdDocument.PromptEventHandler(document_OnPrompt); document.OnProgress -= new VectorDraw.Professional.Utilities.ProgressEventHandler(document_OnProgress); document.GenericError -= new vdDocument.GenericErrorEventHandler(document_GenericError); document.OnLoadUnknownFileName -= new vdDocument.LoadUnknownFileName(document_OnLoadUnknownFileName); document.OnIsValidOpenFormat -= new vdDocument.IsValidOpenFormatEventHandler(document_OnIsValidOpenFormat); document.OnSaveUnknownFileName -= new vdDocument.SaveUnknownFileName(document_OnSaveUnknownFileName); document.OnGetSaveFileFilterFormat -= new vdDocument.GetSaveFileFilterFormatEventHandler(document_OnGetSaveFileFilterFormat); DocComponent.Dispose(); } void document_OnGetSaveFileFilterFormat(ref string saveFilter) { saveFilter = "*.vdml|*.vdcl|*.dxf|*.dwg|*.svg|*.pdf|*.emf|*.HPG|*.bmp|*.jpg|*.png||"; } void document_OnSaveUnknownFileName(object sender, string fileName, out bool success) { success = false; vdDocument document = sender as vdDocument; if (fileName.EndsWith(".dwg", StringComparison.InvariantCultureIgnoreCase)) { success = vdxFcnv.ConversionUtilities.SaveDwg(document, fileName); } else if (fileName.EndsWith(".dxf", StringComparison.InvariantCultureIgnoreCase)) { vdDXF.vdDXFSAVE dxf = new vdDXF.vdDXFSAVE(); success = dxf.SaveDXF(document, fileName); } } void document_OnIsValidOpenFormat(object sender, string extension, ref bool success) { if (extension.EndsWith(".dwg", StringComparison.InvariantCultureIgnoreCase) || extension.EndsWith(".dxf", StringComparison.InvariantCultureIgnoreCase)) { success = true; } } void document_OnLoadUnknownFileName(object sender, string fileName, out bool success) { success = false; vdDocument document = sender as vdDocument; if (fileName.EndsWith(".dwg", StringComparison.InvariantCultureIgnoreCase)) { success = vdxFcnv.ConversionUtilities.OpenDwg(document, fileName); } else if (fileName.EndsWith(".dxf", StringComparison.InvariantCultureIgnoreCase)) { success = vdDXF.vdDXFopen.LoadFromStream(document, new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None)); } } void PrintMessage(string message) { message = message.Replace("\r\n", ""); message = message.Replace("\n", ""); message += new string(' ', Console.BufferWidth - message.Length); lock (Console.Out) { Console.SetCursorPosition(0, lineNo); Console.Out.Write(message); } } void document_GenericError(object sender, string Membername, string errormessage) { vdDocument document = sender as vdDocument; PrintMessage(string.Format("{0,-40} ", System.IO.Path.GetFileName(document.FileName)) + Membername + errormessage); } void document_OnProgress(object sender, long percent, string jobDescription) { if (percent == 0) percent = 100; vdDocument document = sender as vdDocument; PrintMessage(string.Format("{0,-40} ", System.IO.Path.GetFileName(document.FileName)) + jobDescription + " : " + percent.ToString() + "%"); } void document_OnPrompt(object sender, ref string promptstr) { if (promptstr == null) return; string str = promptstr; str = str.Trim(); if (str == string.Empty) return; vdDocument document = sender as vdDocument; PrintMessage(string.Format("{0,-40} ", System.IO.Path.GetFileName(document.FileName)) + str); } } } }
对于以上问答,如果您有任何的疑惑都可以在评论区留言,我们会及时回复。此系列的问答教程我们会持续更新,如果您感兴趣,可以多多关注本教程。
相关资料推荐:
VectorDraw Developer Framework(VDF)示例
如果您对想要购买正版授权VectorDraw Developer Framework(VDF),可以联系咨询相关问题。
关注慧聚IT微信公众号 ???,了解产品的最新动态及最新资讯。