public scan_handle_data pop_queue() { scan_handle_data d = null; if (_queue.Count > 0) { _mutex.WaitOne(); d = _queue.Dequeue(); _mutex.ReleaseMutex(); } return(d); }
//串口接收线程函数 private void recvSCDataProc() { //开始标志 bool start_recv_flag = false; long timeout_readbyte = 0; bool start_sleep = false; long timeout_sleep = 0; while (_sc_recv_flag) { try { //先读取进来 byte data = (byte)_port.ReadByte(); if (start_sleep) { if ((DateTime.Now.Ticks - timeout_sleep) / 10000.0 > 200.0) { start_sleep = false; } else { continue; } } // if (!start_recv_flag) { start_recv_flag = true; timeout_readbyte = DateTime.Now.Ticks; if (data == 0x0d) { continue; } else { _recv_data_queue.Enqueue(data); continue; } } //单个字节间隔超过100ms if (start_recv_flag) { if ((DateTime.Now.Ticks - timeout_readbyte) / 10000.0 > 50.0) { _recv_data_queue.Clear(); timeout_readbyte = DateTime.Now.Ticks; continue; } } if (data != 0x0d) { _recv_data_queue.Enqueue(data); } else { start_recv_flag = false;//重新开始 if (_recv_data_queue.Count == 0) { continue; } else { string sn = Encoding.ASCII.GetString(_recv_data_queue.ToArray()); Console.WriteLine(sn); scan_handle_data dat = new scan_handle_data(); dat.handle = _scanner_handle; dat.sn_data = sn; //放入数据到队列 run_contex.instance()._sn_scan_queue.push_queue(dat); _recv_data_queue.Clear(); //开始休眠 start_sleep = true; timeout_sleep = DateTime.Now.Ticks; } } } catch (Exception e) { break; } } }
public void push_queue(scan_handle_data d) { _mutex.WaitOne(); _queue.Enqueue(d); _mutex.ReleaseMutex(); }
private void _procedure_logic(object p) { while (_logic_flags) { scan_handle_data d = _sn_scan_queue.pop_queue(); if (d != null) { //产品号 if (d.handle == 0) { //修改数据 /* * if (mainForm.getMainForm()._changeValue) { * mainForm.getMainForm()._changeDlg.changeProductSN(d.sn_data); * continue; * } * */ //第一次输入产品,这时候把是否为满的状态置为非满状态 if (_allProductNums > 0 && (_allProductNums == _leaveProductNums) && _isFull && d.sn_data != "" && run_contex.instance()._curBoxsn != "") { _isFull = false; } if (_isFull) { if (run_contex.instance()._curBoxsn == "") { mainForm.getMainForm().setProductNum("请扫描箱号!"); } } //没满开始扫描 if (_isFull == false) { bool checkRes = false; checkRes = checkSN(d.sn_data, _productSnFormula); if (!checkRes) { mainForm.getMainForm().setProductNum("输入的产品号不对!"); //16/5/30 产品号重复也要提示 mainForm.getMainForm().PlayFileAudio("error.wav"); string snstatus = System.Environment.CurrentDirectory + "\\snstatus"; if (File.ReadAllLines(snstatus)[0].Trim() == "-1") { mainForm.getMainForm().setRepeatWarnSNDlg(); } } if (!_isFull && _curFormula != "" && _curBoxsn != "" && checkRes) { mainForm.getMainForm().setProductNum(d.sn_data); // if (_scan_work_logic.onProductScanner(d.sn_data)) { _leaveProductNums = _allProductNums - _curProductNums; mainForm.getMainForm().setLeaveProductNum(_leaveProductNums.ToString()); mainForm.getMainForm().setCurProductNum(_curProductNums.ToString()); mainForm.getMainForm().setAllProductNum(_allProductNums.ToString()); mainForm.getMainForm().setInsertRowData(d.sn_data); //插入数据 mainForm.getMainForm().moveListTolast(); //滚动到最后 if (_curProductNums >= _allProductNums) { //满了 _isFull = true; run_contex.instance().material_ok = false; _curProductNums = 0; _leaveProductNums = _allProductNums; _curBoxsn = "";//箱号为空 //fix bug _scan_work_logic.updateBoxset(run_contex.instance()._curFormula); //fix bug //打包完毕将箱号清零 run_contex.instance()._curBoxsn = ""; mainForm.getMainForm().setBoxNum("本箱产品已经打包完毕!"); //string audiofile_scanok = System.Environment.CurrentDirectory + "\\提示音.wav"; mainForm.getMainForm().PlayFileAudio(); } else { string audiofile_scanok = System.Environment.CurrentDirectory + "\\叮.wav"; System.Media.SoundPlayer sp = new System.Media.SoundPlayer(); sp.SoundLocation = audiofile_scanok; sp.PlaySync(); } } } else if (_isFull) { mainForm.getMainForm().setProductNum("请扫描箱号!"); } } } //箱号 if (d.handle == 1) { //-------------------------------------------------- //这里有bug /* * if (mainForm.getMainForm()._changeValue) { * //更改箱号 * mainForm.getMainForm()._changeDlg.changeBoxSN(d.sn_data); * run_contex.instance()._curBoxsn = d.sn_data;//更改box sn * continue; * } * */ //新加入的料号检查 if (_isFull && run_contex.instance()._env.material_num != "0" && !run_contex.instance().material_ok) { if (d.sn_data.Trim() != run_contex.instance()._env.material_num) { System.Windows.Forms.MessageBox.Show("请先用箱号扫描枪扫入料号!"); } else { run_contex.instance().material_ok = true; mainForm.getMainForm().updateInfo("提示信息:扫描料号成功!"); } return; } mainForm.getMainForm().updateInfo("提示信息:"); //--------------------------------------------------- //满了,并且检查到箱号符合规则,并且配方有效 bool checkres = checkSN(d.sn_data, _boxSnFormula); if (_isFull && checkres && _curFormula != "") { //更新box_set属性 if (!_scan_work_logic.onPBoxScanner(d.sn_data)) { System.Threading.Thread.Sleep(500); run_contex.instance()._curBoxsn = "";//清掉箱号 mainForm.getMainForm().setBoxNum("请不要输入重复的箱号!"); // /* * mainForm.getMainForm().logRepeatTime("重复的箱号:", d.sn_data); * mainForm.getMainForm().PlayFileAudio("Repeat.wav"); * string status = System.Environment.CurrentDirectory + "\\status"; * if (File.ReadAllLines(status)[0].Trim() == "-1") { * mainForm.getMainForm().setRepeatWarnDlg(); * } * */ continue; } mainForm.getMainForm().setBoxNum(d.sn_data); //重新开始计数 if (_curProductNums == 0) { //不重复则返回true if (_scan_work_logic.onPBoxScanner(d.sn_data)) { //这里是一个bug会造成输入连续第二遍箱号输入不进去的情况,所以必须是触发了扫描箱号才能设置 //_isFull = false; run_contex.instance()._leaveProductNums = run_contex.instance()._allProductNums;//触发设置剩余箱数目,因为要用到 mainForm.getMainForm().setAllProductNum(_allProductNums.ToString()); mainForm.getMainForm().setLeaveProductNum(_allProductNums.ToString()); mainForm.getMainForm().setCurProductNum(_curProductNums.ToString()); mainForm.getMainForm().setProductNum(""); //mainForm.getMainForm().setBoxNum(""); } else { System.Threading.Thread.Sleep(500); mainForm.getMainForm().setBoxNum("请不要输入重复的箱号!"); run_contex.instance()._curBoxsn = "";//清掉箱号 _isFull = true; // /* * mainForm.getMainForm().logRepeatTime("重复的箱号:", d.sn_data); * mainForm.getMainForm().PlayFileAudio("Repeat.wav"); * string status = System.Environment.CurrentDirectory + "\\status"; * if (File.ReadAllLines(status)[0].Trim() == "-1") { * mainForm.getMainForm().setRepeatWarnDlg(); * } * */ } } } else if (!checkres) { mainForm.getMainForm().setBoxNum("请检查输入的箱号是否符合规则!"); } } } else { Thread.Sleep(100); } } }