读书人

使用C#开发基于Compact Framework程序

发布时间: 2012-03-04 11:13:33 作者: rapoo

使用C#开发基于Compact Framework程序时遇到疑难问题!
我开发的设备是条码的扫描设备,厂家提供了一个SDK中有一个Reader类,我对这个类的包装如下:
/// <summary>
/// 扫描类
/// </summary>
public class BarcodeReader:IDisposable
{
public Reader reader = null;
public ReaderData readerData = null;

/// <summary>
/// 条码扫描完成后触发该事件
/// </summary>
public event OnBarcodeOverHandler OnBarcodeOver;

public BarcodeReader()
{
if (reader == null)
{
reader = new Reader();

}
if (readerData == null)
{
readerData = new Symbol.Barcode.ReaderData(
Symbol.Barcode.ReaderDataTypes.Text,
Symbol.Barcode.ReaderDataLengths.MaximumLabel);
}
reader.ReadNotify += new EventHandler(reader_ReadNotify);
reader.Actions.Enable();
reader.Actions.Read(readerData);
}


private void reader_ReadNotify(object sender, EventArgs e)
{
if (this.OnBarcodeOver != null)
{
Symbol.Barcode.ReaderData TheReaderData = this.reader.GetNextReaderData();
if (TheReaderData.Result == Symbol.Results.SUCCESS)
{
OnBarcodeOver(TheReaderData.Text);
}
}
reader.Actions.Read(readerData);//这个很关键,每次扫描成功后必需调用该方法才能使设备处于可扫描的状态.否则设备的激光头都不亮了
}

我的程序中有窗体的基类FormBase,在FormBase中包含了BarcodeReader类的实例,且有下面的代码:


public static BarcodeReader Barcode = null;
static ScanFormBase()
{
Barcode = new BarcodeReader();
}
public virtual void Barcode_OnBarcodeOver(string barcode)
{
try
{
Control c = GetFocusedControl;
TextBox text = c as TextBox;
if (text != null)
text.Text = barcode;
ComboBox box = c as ComboBox;
if (box != null)
{
if (box.DropDownStyle == ComboBoxStyle.DropDown)
{
box.Text = barcode;
}
}
SetNextControlFocused();
}
catch (NothingControlException)
{
}
catch (Exception)
{
throw;


}
}
/// <summary>
/// 是否需要启用扫描
/// </summary>
public virtual bool NeedListenBarcode
{
get
{
return _needListenBarcode;
}
set
{
_needListenBarcode = value;
switch (value)
{
case true:
if (_barcodeEvent == null)
{
_barcodeEvent = new OnBarcodeOverHandler(Barcode_OnBarcodeOver);
Barcode.OnBarcodeOver += _barcodeEvent;
}
break;
case false:
if (_barcodeEvent != null)
{


Barcode.OnBarcodeOver -= _barcodeEvent;
_barcodeEvent = null;
}
break;
}

}
}

有两个窗体继承自FormBase,它们是Form1和Form2,其中Form1重写了ScanFormBase中的Barcode_OnBarcodeOver方法,其中最主要的是使用Form2的一个实例对象ShowDialog()了.

*************************现在的问题是:************************
设备每次执行完毕后,都必需
程序运行起来后显示了Form1,通过设备上的按钮触发了BarcodeReader的reader_ReadNotify方法(不是我调用的而是设备按钮触发的)后,调用了Form1的Barcode_OnBarcodeOver,这个方法里面我使Form2的实例对象ShowDialog.这造成的结果是BarcodeReader的reader_ReadNotify方法没有执行完毕,那么reader.Actions.Read(readerData);这句就没有执行,则Form2中无法打开扫描功能(原因见reader.Actions.Read(readerData)这句后面的注释).

有没有方法使得在BarcodeReader的reader_ReadNotify方法中引发事件后立即返回?而不是用等待事件执行完毕后再返回?

困扰我一下午了,等待热心网友.分不够再加.先在此谢过.

[解决办法]
不会,昨天才开始看Compact Framework。现在都还没搞清楚怎么在仿真器里连本机的sql数据库
- -!

读书人网 >C#

热点推荐