0
私はいくつかのデータを受け取って処理した後、印刷したいプログラムを開発しています。それは自動印刷でなければなりません。データはprintListキューにレコードとして追加されます。スレッドはそれを一つずつ印刷します。コード:バックグラウンドスレッドによる自動印刷の実装方法
private void button4_Click(object sender, EventArgs e)
{
rwl.AcquireWriterLock(10);
try
{
if (automaticPrint == false)
{
automaticPrint = true;
_automaticPrintThread = new Thread(new ThreadStart(AutomaticPrintA4));
_automaticPrintThread.IsBackground = true;
_automaticPrintThread.Start();
}
else
{
automaticPrint = false;
if (_automaticPrintThread != null)
{
_automaticPrintThread.Join(1);
}
}
}
finally
{
rwl.ReleaseWriterLock();
}
}
private void AutomaticPrintA4()
{
try
{
this.AutomaticPrintA4Delegate();
}
catch (Exception e)
{
this._automaticPrintThread.Abort();
MessageBox.Show(e.StackTrace);
}
}
private void AutomaticPrintA4Delegate()
{
try
{
if (this.InvokeRequired)
this.Invoke(new MethodInvoker(AutomaticPrintA4Delegate));
else
{
rwl.AcquireReaderLock(100);
Telerik.Reporting.Processing.ReportProcessor rp = new Telerik.Reporting.Processing.ReportProcessor();
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
try
{
while (automaticPrint)
{
rwlprintlist.AcquireReaderLock(10);
try
{
if (Session.printList != null)
{
if (Session.printList.Count != 0)
{
if (Session.printList[0] != null)
{
rp.PrintReport(new Report(Session.printList[0]), ps);
LockCookie lc = rwlprintlist.UpgradeToWriterLock(10);
Session.printList.RemoveAt(0);
rwlprintlist.DowngradeFromWriterLock(ref lc);
}
}
else
{
Thread.Sleep(1000);
}
}
else
{
Thread.Sleep(1000);
}
}
finally
{
rwlprintlist.ReleaseReaderLock();
}
}
}
finally
{
rwl.ReleaseReaderLock();
}
}
}
catch (Exception e)
{
MessageBox.Show("Print : " + e.StackTrace + e.Message);
}
}
ボタンのクリックで自動印刷変数が制御されます。 rwlは自動プリントへのアクセスを制御し、rwlprintlistはprintListへのアクセスを制御します。 しかし、このスレッドを開始するたびに私のメインGUIがハングアップします。なぜか分かりませんか?
P.S.他のデザインアイデアは高く評価されます。
メモ:これは多くの環境ではひどい考えです。しかし、アプリケーションが人間の介入なしに(読み込み:無駄な)会社のリソースを利用することを決めるときはいつでも、2度考えなければならない理由があると確信しています。 –
それは私のユーザー要求でした、私はそれを否定できません。 – armin