c#多线程问题

灵子 2015-11-06 08:54:00
调用一个读卡器的dll,有个取消操作,用的多线程。winform有两个按钮。。一个是读卡。一个是取消读卡。。点击读卡,机器等待刷卡操作。。。现在有个问题。。一开始怎么读都可以。。。但是点一次取消操作后。。再点读卡,调用读卡函数,机器不能进入等待状态了。。二楼代码
...全文
277 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdashewan 2015-11-06
  • 打赏
  • 举报
回复
引用 8 楼 liu2345666 的回复:
就是直接返回i还是等于-6。。没报什么错误
你看下-6代表什么错误,既然是-6那肯定有意义,没文档就问写那个DLL的人
灵子 2015-11-06
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
机器不能进入等待状态,现象是什么,或者说错误在哪里,你自己调试过吗
就是直接返回i还是等于-6。。没报什么错误
灵子 2015-11-06
  • 打赏
  • 举报
回复
引用 5 楼 szOOrz 的回复:
看上去情况是这样的。 你用的这个Dll应该还有一个类似于Open的方法。 1.Open() 2.Read() or Write() 3.Close() 默认是Open()的。你可以Read()也可以Write()。 当你Close()了。你想再Read()。你恐怕要先检查一下IsOpen()。

if(!IsOpen())
Open();
Read();
但是文档没有给open()函数。。。。。
好几只小萝莉 2015-11-06
  • 打赏
  • 举报
回复
看上去情况是这样的。 你用的这个Dll应该还有一个类似于Open的方法。 1.Open() 2.Read() or Write() 3.Close() 默认是Open()的。你可以Read()也可以Write()。 当你Close()了。你想再Read()。你恐怕要先检查一下IsOpen()。

if(!IsOpen())
Open();
Read();
灵子 2015-11-06
  • 打赏
  • 举报
回复
就是直接返回i还是等于-6。。没报什么错误
xdashewan 2015-11-06
  • 打赏
  • 举报
回复
机器不能进入等待状态,现象是什么,或者说错误在哪里,你自己调试过吗
灵子 2015-11-06
  • 打赏
  • 举报
回复
灵子 2015-11-06
  • 打赏
  • 举报
回复
灵子 2015-11-06
  • 打赏
  • 举报
回复
public partial class Form1 : Form { int i; byte[] second; public Form1() { InitializeComponent(); } //读卡 [DllImport("CardAp_Msg.dll", EntryPoint = "CT_ReadMsgCard")] unsafe public static extern int CT_ReadMsgCard(int nPort, int dwBaud, string chBpNo, int nCharset, int nTimeout, byte[] szTrack2, int nTrack2Len, byte[] szTrack3, int nTrack3Len); //取消读卡 [DllImport("CardAp_Msg.dll", EntryPoint = "CT_CancelReadMsgCard")] unsafe public static extern void CT_CancelReadMsgCard(); //写卡 [DllImport("CardAp_Msg.dll", EntryPoint = "CT_WriteMsgCard")] unsafe public static extern int WriteMsgCard(int nPort, int dwBaud, string chBpNo, int nCharset, int nTimeout, string szTrack2, string szTrack3); Thread thread = null; unsafe private void button1_Click(object sender, EventArgs e) { thread = new Thread(new ThreadStart(delegate() { run(); }));//线程 thread.Start(); } public void run() { second = new byte[50]; i = CT_ReadMsgCard(1, 9600, null, 0, 20, second, 50, null, 0); MethodInvoker mi = new MethodInvoker(SET); this.richTextBox1.Invoke(mi); } public void SET() { switch (i) { case 0: string result = Encoding.UTF8.GetString(second).Trim('\0'); this.richTextBox1.Text = result; break; case -1: this.richTextBox1.Text = "打开设备失败"; break; case -2: this.richTextBox1.Text = "与设备通讯失败"; break; case -3: this.richTextBox1.Text = "接收到的数据错误(校验值错误)"; break; case -4: this.richTextBox1.Text = "读卡操作失败"; break; case -5: this.richTextBox1.Text = "写卡操作失败"; break; case -6: this.richTextBox1.Text = "用户取消操作"; break; case -7: this.richTextBox1.Text = "超时"; break; default: break; } } private void button2_Click(object sender, EventArgs e) { CT_CancelReadMsgCard(); } }
灵子 2015-11-06
  • 打赏
  • 举报
回复
哎。。。。。。。。
灵子 2015-11-06
  • 打赏
  • 举报
回复
引用 11 楼 johnliuyuan 的回复:
既然-6是用户取消操作,说明你那个取消的函数设定了读卡的状态,所以应该还有函数恢复这个状态,这个问题你应该问开发读卡器dll的人,问问他是什么原因,否则你光靠猜恐怕不好办
我们有一个demo,也是用的那个dll。。运行的很好。。。没有问题。。。dll也看了。。就那三个函数。。。
john_QQ:2335298917 2015-11-06
  • 打赏
  • 举报
回复
既然-6是用户取消操作,说明你那个取消的函数设定了读卡的状态,所以应该还有函数恢复这个状态,这个问题你应该问开发读卡器dll的人,问问他是什么原因,否则你光靠猜恐怕不好办
灵子 2015-11-06
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
[quote=引用 8 楼 liu2345666 的回复:] 就是直接返回i还是等于-6。。没报什么错误
你看下-6代表什么错误,既然是-6那肯定有意义,没文档就问写那个DLL的人[/quote]-6就是用户取消操作

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧