求问大家关于蓝牙收数据开线程的问题!!谢谢大家

最近做毕业设计,基于52单片机的蓝牙温控风扇需要写个app,我用的别人的源码改的。
图片说明他是进另一个界面连接蓝牙再回来打开接收的线程。但是我现在不需要这个开关,图片说明我去掉之后发现没法开线程了,我在蓝牙连接界面开线程的话会闪退,在主界面判断就只能判断一次。。。想问问大家该怎么做?现在很烦恼。。。谢谢大家了 public void onCheckedChanged() {
while(true){
if (DeviceActivity.isConnect) {
new ReceiveThread().start();
showToast("连接");
}else{
showToast("为连接");
}
}
}只判断一次

        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            isConnect = true;

// button1.setBackgroundColor(Color.GREEN);
showToast("连接成功");
finish();
// MainActivity MA = new MainActivity();
// MainActivity.ReceiveThread RT = MA.new ReceiveThread();
// RT.start();
}闪退

1个回答

你好像把它开启线程代码注释了
new ReceiveThread().start()

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

C# 串口接收数据处理线程遇到的问题求高手帮助!

C# 串口接收数据处理时遇到队列有值,但报错InvalidOperationException,队列为空的问题。 代码如下:private void dataProcessing() { byte[] data = new byte[2] {0,0}; float sensor_data = 0f;//用来记录转化后的数据 //float data_high8 = 0f; int timerDraw=0; while (true) { if (dataQueue.Count >=2)//dataQueue中数据长度大于2时,进行数据处理 { lock (dataQueue) { **data[1] = (byte)dataQueue.Dequeue();** 在此处出现未处理InvalidOperationException 队列为空的问题 //data_high8 = data[1]; if ((data [1] &240) != 0)//如果高四位不是0,说明数据有误 { MessageBox.Show("数据错误!!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } data[0] = (byte)dataQueue.Dequeue(); sensor_data = BitConverter.ToInt16 (data, 0)*3.3f/4096f ; switch (timerDraw) { case 0: timerDraw++; addToList(sensor_data, list1, List1); break; case 1: timerDraw++; addToList(sensor_data, list2, List2); break; case 2: timerDraw++; addToList(sensor_data, list3, List3); break; case 3: timerDraw++; addToList(sensor_data, list4, List4); break; case 4: timerDraw = 0; addToList(sensor_data, list5, List5); if (List5 .Count /2==maxCount )//已接收完数据 { stopTraining(); } break; } } } } } 非常感谢!!

关于mina框架中接收数据多线程处理的问题

服务器会同时用多个线程给你发送数据,如何在mina框架中开启多个线程接收数据

蓝牙串口通信数据接收问题

各位高人,我在做一个关于蓝牙串口通信的项目,现在涉及到接收返回的数据并进行处理。 现在的问题是数据总是接收不全。接收的数据有两种格式,1.以F2或F5开头的三个字节的 数据。2 是以F1 开头的12个字节的数据。以下是我接收的数据 03-12 14:08:03.214: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12140001000000304000076 03-12 14:08:04.144: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: f1 03-12 14:08:04.178: D/BluetoothService(31197): --buffer.length is: 11. InStream.read() buffer is: 2100001000000304000036 03-12 14:08:05.140: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: f1 03-12 14:08:05.172: D/BluetoothService(31197): --buffer.length is: 10. InStream.read() buffer is: 21400010000003040000 03-12 14:08:05.173: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: 76 03-12 14:08:05.223: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: f1 03-12 14:08:05.225: D/BluetoothService(31197): --buffer.length is: 9. InStream.read() buffer is: 214000100000030300 03-12 14:08:05.258: D/BluetoothService(31197): --buffer.length is: 2. InStream.read() buffer is: 0071 03-12 14:08:08.711: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12100001000000303000031 03-12 14:08:09.664: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: f1 03-12 14:08:09.665: D/BluetoothService(31197): --buffer.length is: 9. InStream.read() buffer is: 214000100000030300 03-12 14:08:09.698: D/BluetoothService(31197): --buffer.length is: 2. InStream.read() buffer is: 0071 03-12 14:08:15.959: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12100001000000303000031 03-12 14:08:17.244: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12100001000003c0300000e 03-12 14:08:17.681: D/BluetoothService(31197): --buffer.length is: 11. InStream.read() buffer is: f12100001000003c033000 03-12 14:08:17.692: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: 3e 03-12 14:08:18.374: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: f1 03-12 14:08:18.388: D/BluetoothService(31197): --buffer.length is: 10. InStream.read() buffer is: 2100001000003c043000 03-12 14:08:18.395: D/BluetoothService(31197): --buffer.length is: 1. InStream.read() buffer is: 39 03-12 14:08:20.252: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12100001000000204000037 03-12 14:08:22.713: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12100001000000203000030 03-12 14:08:26.756: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12140001000000203000070 03-12 14:08:30.268: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12140001000001a03000068 03-12 14:08:31.775: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f10100001000001a03000008 03-12 14:08:32.730: D/BluetoothService(31197): --buffer.length is: 10. InStream.read() buffer is: f12140001000001a0300 部分代码如下: public void run() { Log.i(TAG, "BEGIN mConnectedThread"); byte[] buffer = new byte[12]; byte[] tempBuffer = new byte[100]; int bytes; int index = 0; int sum = 0; // Keep listening to the InputStream while connected while (true) { try { // Read from the InputStream if (mmInStream.available() > 0) { if (D) Log.d(TAG, mmInStream.available() + " 1 mminsream---" + index + " " + sum + " " +tempBuffer[0]+ (tempBuffer[0] == (byte) 0xF1)+ " (tempBuffer[0]==(byte)0xF5)=" + (tempBuffer[0] == (byte) 0xF5) + " (tempBuffer[0]==(byte)0xF2)=" + (tempBuffer[0] == (byte) 0xF2)); bytes = mmInStream.read(buffer); byte[] arr = new byte[bytes]; if (buffer[0] == (byte) 0xF1 || buffer[0] == (byte) 0xF5 || buffer[0] == (byte) 0xF2 || sum > 12) { index = 0; sum = 0; } System.arraycopy(buffer, 0, arr, 0, bytes); for (int i = 0; i < bytes; i++) { if (i > 0 && (arr[i] == (byte) 0xF1 || arr[i] == (byte) 0xF2 || arr[i] == (byte) 0xF5)) { Log.d(TAG, "break i =" + i + (i > 0 && (arr[i] == (byte) 0xF1 || arr[i] == (byte) 0xF2 || arr[i] == (byte) 0xF5))); break; } tempBuffer[i + index] = arr[i]; sum++; } if (D) Log.d(TAG, mmInStream.available() + " 2 mminsream---" + index + " " + sum + " (tempBuffer[0]==(byte)0xF1)=" + (tempBuffer[0] == (byte) 0xF1) + " (tempBuffer[0]==(byte)0xF5)=" + (tempBuffer[0] == (byte) 0xF5) + " (tempBuffer[0]==(byte)0xF2)=" + (tempBuffer[0] == (byte) 0xF2) + " sum=" + sum); index = index + bytes; if (sum == 12 && tempBuffer[0] == (byte) 0xF1) { // Send the obtained bytes to the UI Activity Bundle bundle = new Bundle(); bundle.putInt(BUNDLE_TYPE, MainActivity.MESSAGE_READ); bundle.putByteArray("buffer", tempBuffer); bundle.putInt("length", sum); showMessage(bundle); index = 0; sum = 0; } if (sum == 3 && (tempBuffer[0] == (byte) 0xF2 || tempBuffer[0] == (byte) 0xF5)) { // Send the obtained bytes to the UI Activity Bundle bundle = new Bundle(); bundle.putInt(BUNDLE_TYPE, MainActivity.MESSAGE_READ); bundle.putByteArray("buffer", tempBuffer); bundle.putInt("length", sum); showMessage(bundle); index = 0; sum = 0; } 还请高人指教。

多线程问题!!同时监听socket和串口

我要写一个软件,其中需要同时监听socket和串口。socket监听的内容为采集的数据信息,串口监听得到的消息用来控制socket停止接收数据。现在使用了Windows的定时器settimer间隔一定时间接收一次socket的数据;开辟了一个新的线程用于等待串口的消息,使用waitforsingleobject无限期地等待串口发来命令。但是现在的问题就是如果一直监听串口就无法接受socket发来的数据;如果不实时监听串口而是间隔一段时间再监听,那么有可能外部命令发来时没有被串口监听到,从而无法停止socket接受数据。

android怎么实现蓝牙实时接收数据 inputstream

现在在做一个APP 单片机通过蓝牙模块 将数据发送到手机上并显示 现在搜索蓝牙 配对 连接都没问题 但是做到接收数据这一步的时候遇到了一些问题 首先是 调用inputstream函数的时候 程序会阻塞 (我也看了资料说是放到线程里 但是放进去之后 却不能实时接收了 或者说是不能接收完全) 然后是 我想设置一个 开始接收的按钮 按一下就开始自动接收 再按另一个就停止接收 然后这一部分又怎么实现 有没有大神可以帮我?求助! (我现在用的是Handler线程 用了postdelay方法来掩饰接收更新,然后用了OnTouch检测按钮是否按下 按下就接收 松开就停止)但现在我想换成例如 OnClick的接口 怎么办? 以下是 handler 函数 求大神帮忙! ``` class btnlistener implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent event) { // TODO 自动生成的方法存根 if (event.getAction()==MotionEvent.ACTION_DOWN) { System.out.println(message+"I m motion"); revhandler.post(ReciveMsg); } else if (event.getAction() == MotionEvent.ACTION_UP) { revhandler.removeCallbacks(ReciveMsg); } return false; } } Handler revhandler = new Handler(); Runnable ReciveMsg = new Runnable() { public void run() { int i =0; try{ InputStream inputStream = bluetoothSocket.getInputStream(); byte data[]= new byte[5]; while((i=inputStream.read(data))!=-1){ if(inputStream.available()==0){ break; } message = new String(data); System.out.println(message); textV.setText(message); } } catch(IOException e){ e.printStackTrace(); } revhandler.postDelayed(ReciveMsg,200); } }; ```

Android程序通过蓝牙接收蓝牙设备传递过来的数据

在edittext上显示蓝牙设备传递过来的数据,并根据数据数值的变化,随时更改edittext里的值. 求教大神

android蓝牙实时接收数据接收一次后就不循环了为什么?

单片机0.5秒通过蓝牙发一次数据过来,android开启一个线程进行接收,线程里面是循环接收的,现在接收一次之后就不再接收了,循环也不起作用,这是为什么?部分程序如下 //存储文件并显示的线程 private class saveimageThread extends Thread { public saveimageThread(BluetoothSocket btSocket) { while(saveflag==0) { InputStream tmpIn =null; inStream=null; try { tmpIn=btSocket.getInputStream(); } catch (IOException e) { Log.e(TAG,"temp scoket not created",e); } inStream=tmpIn; saveflag=1; } } @Override public void run() { while(D) { int picname=1; Log.i("saveimage","start"); try{ byte[] buffer=new byte[1024]; //dri为保存路径,SD卡中的carImage文件夹 //从蓝牙获取输入流 while (inStream!=null) { Log.e("","InputStream"); int l = -1; try{ while((l = inStream.read(buffer)) != -1) //l = inStream.read(buffer); { ByteArrayOutputStream outStream=new ByteArrayOutputStream(); outStream.write(buffer,0,buffer.length); //inStream.close(); byte[] data = outStream.toByteArray(); Log.e("","data is ready!"); 略 } //while((l = inStream.read(buffer)) != -1) }catch (Exception e){ e.printStackTrace();} //byte[] data=new byte[j-3]; //out.write(buffer,0,buffer.length); //buffer=null; break; } //while (inStream!=null) } catch (Exception e){ e.printStackTrace(); System.err.println("Can't start"); } try { sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //while(D) } }

菜鸟求问Java关于线程的问题!!

问题是这样的,尝试开发一个窗体,在窗体内有两个按钮,一个start,一个stop,当点击start按钮时在控制台持续打印一句话,当用户点击stop按钮时控制台打印结束。我的源代码是这样的,不知道哪里出错了,按下start以后就按不动stop了,求大神解答! import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Thread22 extends Frame { Boolean flag = true; Button b1; Button b2; public static void main(String[] args) { new Thread22().F(); } public void F(){ b1 = new Button("start"); b2 = new Button("stop"); add(b1, BorderLayout.NORTH); add(b2, BorderLayout.CENTER); new B1().start(); new B2().start(); pack(); setVisible(true); } class B1 extends Thread{ public void run() { b1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { while(flag){ System.out.println("start"); } } }); } } class B2 extends Thread{ public void run() { b2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { flag = false; } }); } } }

C#编写串口数据收发程序,收发频繁,求教多线程处理机制!

![![![![图片说明](https://img-ask.csdn.net/upload/201604/20/1461167601_434062.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167592_877283.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167576_770964.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167565_101017.jpg)C#编写串口数据收发程序,点击界面按钮发送指令数据,等待接收返回的数据,此外还有周期性数据需要不断接收;接收到的数据要判断重复帧和是否是最后一帧,然后去掉帧头帧尾并显示在界面控件内;目前程序开了三个线程:接收、处理、发送,三个线程都是一直循环判断指针是否有更新,但这样导致界面切换太卡,请问该怎么处理这三个线程之间的关系才能使界面切换流畅呢,初学C#,如果能给出具体修改代码方法更佳,请大神帮帮忙啊~急!

Android蓝牙通讯接收到的数据是一段一段的,不能连起来,什么原因?

编写了一个蓝牙通讯的上位机,和单片机通讯,目前用串口通讯助手测试的时候发现,每次给蓝牙串口发一个大串数据的时候,手机上接收到的总是分段显示 比如我发一个“123456789123456789123456789” 手机上接收到则显示“12345”“67891234”“567891”“23456789”等类似的数据,有时候还会丢数据。。。 这是接收到的数据 我直接输出在LogCat上的显示一段一段的 ![图片说明](https://img-ask.csdn.net/upload/201609/26/1474875151_388275.png) 以下是代码 写了一个线程 线程来 处理 Input数据流 然后用hanler.message把数据发送到handler进行打印或者显示 界面还有一个按钮 开控制线程的开始 ``` //handler处理数据 Handler revhandler = new Handler(){ public void handleMessage(android.os.Message msg) { byte[] writeBuf = (byte[]) msg.obj; String writeMessage = new String(writeBuf,0,msg.arg1); textV.setText(writeMessage); System.out.println("---->>>"+writeMessage); }; }; //接收线程 private class receivethread extends Thread{ private final BluetoothSocket mmSocket; private final InputStream mmInStream; public receivethread(BluetoothSocket socket) { mmSocket = socket; InputStream tmpIn = null; try { tmpIn = socket.getInputStream(); } catch (IOException e) { Log.e(TAG, "temp sockets not created", e); } mmInStream = tmpIn; } @Override public void run() { byte[] buffer = new byte[1024]; int bytes; // TODO 自动生成的方法存根 try { while ((bytes = mmInStream.read(buffer))!=-1) { revhandler.obtainMessage(1, bytes, -1, buffer).sendToTarget(); } } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }} ``` 求各位大神指导!!

有关线程收发串口数据的问题

最近写一个项目里面用到的是基于串口通信的。 由于我需要一直处于接收数据状态,并且可以随时发送数据(我的串口是RS232,支持全双工),于是想到了用两个线程去做。 一个处于收状态,一个发包用。 现在的问题是:我只有一个SerialPort对象 ,通过跨类的信号和槽得到这个对象,但是一放在线程的run函数读写就会报错。 我曾想过把串口的设置和连接放在线程类里面做,但是我这边两个线程呢,一个链接的话,端口就会被占用,另外一个线程就没法连接 困了一天了 不知道该怎么办 我还想过把收发都放在一个线程里做 不知道这样可不可以 效率怎么样

手机蓝牙接收蓝牙模块发过来的图像数据只有第一帧能正常显示,之后的都不能完整显示

蓝牙模块每隔0.5秒发送一帧图像数据过来,手机接收后保存为jpg图片,现在只能将进入线程后接收到的第一次数据完整保存为jpg图片,之后每一次的数据都是不全的,这是为什么?接收数据的部分程序如下,我是想有数据传过来就接收处理的,不过感觉效果不好 //存储文件并显示的线程 private class saveimageThread extends Thread { public saveimageThread(BluetoothSocket btSocket) { InputStream tmpIn =null; inStream=null; try { tmpIn=btSocket.getInputStream(); } catch (IOException e) { Log.e(TAG,"temp scoket not created",e); } inStream=tmpIn; } @Override public void run() { int picname=1; Log.i("saveimage","start"); //保存图片 try{ byte[] buffer=new byte[50000]; //dri为保存路径,SD卡中的carImage文件夹 //从蓝牙获取输入流 while (inStream!=null) { Log.e("","InputStream"); int l = -1; try{ while((l = inStream.read(buffer)) != -1) //l = inStream.read(buffer); { ByteArrayOutputStream outStream=new ByteArrayOutputStream(); outStream.write(buffer,0,buffer.length); //inStream.close(); byte[] data = outStream.toByteArray(); Log.e("","data is ready!"); //后面都是对data数组进行处理m while(data.length>0){ 略 } //break; } }catch (Exception e){ e.printStackTrace();} break; } } catch (Exception e){ e.printStackTrace(); System.err.println("Can't start"); } try { sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

求助一个MFC多线程串口通信的问题!!!!

功能简述:通信采用的是modbus协议,该软件是作为从机,即主机给我的软件发送请求命令,我解析命令后,将要请求的数据发给主机。 我的策略:采用一个接收线程和一个发送线程,当接收线程接收到数据后发消息给主线程,主线程在消息响应函数中将接收线程的数据流进行了解析,每次会解析出好多条命令,然后根据每一天命令我开始组织要回复的数据,组织好一条数据后SetEvent,通知发送线程进行发送。 困惑的问题: 1.我的策略是否有问题? 2.我的容器里有好多条主机请求命令,循环取出一条命令后组织回复数据,然后组织好一条数据后SetEvent,通知发送线程进行发送,那如果主线程的时间片没有到,发送线程就不会被调用,那么就会进入下一个循环取命令然后组织回复数据,这个时候就会把上一条要回复的数据给覆盖掉了,怎么办?到底该是一个什么样的处理流程呢?新人困惑求高手解答 3.我没有c币了,不好意思

关于QT中子线程接收数据,主线程在lcdnumer上的显示问题

我是在QT中写的客户端,与linux中写的服务器连接,连通时自动在lcdnum上面分别显示温度和湿度。网上的例子也看了很多,但是还是一直出错,具体代码如下,有大牛给个思路吗? #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QThread> #include <QString> #include <QDebug> #include <QSemaphore> class mythread { public: mythread(QObject * parent = 0); ~mythread(); protected: void run(); signals: void temsignal(int); void humsignal(int); private: int number; }; #endif // MYTHREAD_H #ifndef DIALOG3_H #define DIALOG3_H #include <QDialog> #include <QThread> #include "mythread.h" #include <QLCDNumber> #include <QObject> namespace Ui { class Dialog3; } class Dialog3 : public QDialog { Q_OBJECT public: explicit Dialog3(QWidget *parent = 0); ~Dialog3(); private slots: void lcdnum1set(int); void lcdnum2set(int); private: QLCDNumber *lcdnum1; //int number; //void lcdnumset1(int num); //void lcdnumset2(QString hum2); private: Ui::Dialog3 *ui; mythread *my_thread; }; #endif // DIALOG3_H #include "mythread.h" #include "mytcp.h" #include <QMessageBox> mythread::mythread(QObject *parent) :QThread(parent) { } mythread::~mythread() { } void mythread::run() { qDebug()<<"开始接收温度湿度数据"; int a=1; int b=2; int data; int buff1; int buff2; tcpsocket->waitForBytesWritten(); data=tcpsocket->write(a,sizeof(a)); if(data>0) { tcpsocket->waitForReadyRead(); tcpsocket->read(buff1); emit temsignal(buff1); sleep(1); } else { qDebug()<<"写数据失败"; } tcpsocket->waitForBytesWritten(); data=tcpsocket->write(b,sizeof(b)); if(num<0) { tcpsocket->waitForReadyRead(); tcpsocket->read(buff2); emit humsignal(buff2); sleep(1); } else { qDebug<<"写数据失败"; } } #include "dialog3.h" #include "ui_dialog3.h" #include "mytcp.h" #include <QMessageBox> #include "mythread.h" #include <QLCDNumber> Dialog3::Dialog3(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog3) { ui->setupUi(this); setWindowTitle("用户界面"); my_thread=new mythread();//connect之前需要实例化 connect(my_thread,SIGNAL(temsignal(int)),this,SLOT(lcdnum1set(int))); connect(my_thread,SIGNAL(humsignal(int)),this,SLOT(lcdnum2set(int))); //my_thread->start(); } Dialog3::~Dialog3() { delete ui; } void Dialog3::lcdnum1set(int num) { ui->lcdnum1->display(num); } void Dialog3::lcdnum2set(int num) { ui->lcdnum2->display(num); }

qt 线程中接收socket数据

#ifndef TCP_THREAD_H #define TCP_THREAD_H #include <QThread> #include <QTcpSocket> #include <QTcpServer> #define MAX_SEND_MSG_LEN 68 struct _loop_buf { int num_of_unit; // Number of data units int unit_size; int rhead; // Head for read int whead; // Head for write void *buf_head; }; class TcpThread : public QThread { Q_OBJECT private: QTcpServer *tcpServer; QTcpSocket *socket; QString ipAddress; quint16 destinationPort; int Flag; bool quit; struct _loop_buf loop_buf; void run() Q_DECL_OVERRIDE; void processMessage(char *msg); int init_loop_buf(struct _loop_buf *loop_buf, int num_of_unit, int unit_size); void reset_loop_buf(struct _loop_buf *loop_buf); void release_loop_buf(struct _loop_buf *loop_buf); int read_data_from_loop_buf(struct _loop_buf *loop_buf, void *data_unit); QByteArray bytes; QByteArray byteGet; public: TcpThread(QString ipAddress, quint16 destinationPort, QObject *parent = 0); ~TcpThread(); int addMessage(void *data_unit); signals: void error(int socketError, const QString &message); public slots: void finishWork(void); void newConnectionSlot(); void dataReceived(); }; #endif // TCP_THREAD_H .h文件 ``` #if defined(_MSC_VER) && (_MSC_VER >= 1600) #pragma execution_character_set("utf-8") #endif //#define MAX_SEND_MSG_LEN = 68 #include "TcpThread.h" #include "widget.h" #include <QDebug> TcpThread::TcpThread(QString ipAddress, quint16 destinationPort, QObject *parent) : QThread(parent), quit(false) { this->ipAddress = ipAddress; this->destinationPort = destinationPort; // Initialize loop buffer // Max length of messages to be sent is 68 bytes. if (init_loop_buf(&loop_buf, 128000, MAX_SEND_MSG_LEN) != 0) { qDebug() << "Can't initialize loop buffer."; return; } } TcpThread::~TcpThread() { // Wait for the end of the thread. quit = true; wait(); } void TcpThread::run() { // // At here, it is in the execution context of newly created thread. // So, it is better to define or create objects here. // Or, following error may occurred: // QObject: Cannot create children for a parent that is in a different thread // char *msg;//, *sendMsg; int conn_timeout = 30000; int read_timeout = 5000; int write_timeout = 5000; int bytesToRead, readBytes; int bytesToWrite, writeBytes; int ret; int gotMessageHead = 0; int toGetNewMessage = 0; //msg = (char *)calloc(65536 + 128, 1); msg = (char *)calloc(MAX_SEND_MSG_LEN, 1); if (msg == NULL) { qDebug() << "Can't allocate memory."; return; } tcpServer = new QTcpServer(); socket = new QTcpSocket(); //connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnectionSlot()), Qt::DirectConnection); if (!tcpServer->isListening()) { qDebug() << ipAddress; //if (tcpServer->listen(QHostAddress::QHostAddress(ipAddress), 16512)) if (tcpServer->listen(QHostAddress::Any, 16512)) { //m_pEdt_Info->append(QObject::tr("打开监听端口成功!111")); qDebug()<< QObject::tr("打开监听端口成功!111"); socket = tcpServer->nextPendingConnection(); // //connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); connect(socket, SIGNAL(readyRead()),this, SLOT(dataReceived())); } else { //m_pEdt_Info->append(QObject::tr("打开监听端口失败!")); qDebug()<< QObject::tr("打开监听端口失败!11"); } } else { //m_pEdt_Info->append(QObject::tr("正在监听中...!")); qDebug()<< QObject::tr("正在监听中...!"); } qDebug() << "Connected to" << ipAddress; // reset read variables readBytes = 0; bytesToRead = 4; gotMessageHead = 0; // reset write variables writeBytes = 0; toGetNewMessage = 1; } void TcpThread::processMessage(char *msg) { qDebug() << "Receive message:" << *(unsigned short *)msg << ". Length:" << *(unsigned short *)(msg + 2); } void TcpThread::finishWork(void) { quit = true; } int TcpThread::init_loop_buf(struct _loop_buf *loop_buf, int num_of_unit, int unit_size) { unsigned long long total_size; total_size = (unsigned long long)unit_size * (unsigned long long)num_of_unit; if (total_size > 0x7fffffff) { printf("Memory to be allocated is too large.\n"); return -1; } if (num_of_unit > 0x7ffffff0) { printf("Buffer size can't exceed 0x7ffffff0.\n"); return -1; } loop_buf->num_of_unit = num_of_unit; loop_buf->unit_size = unit_size; loop_buf->rhead = 0; loop_buf->whead = 0; loop_buf->buf_head = malloc(total_size); if (loop_buf->buf_head == NULL) { printf("Can't allocate memory for the loop buffer.\n"); return -1; } return 0; } // Be careful to call this function. You must make sure that // nobody is using the loop buffer pointed by 'loop_buf', // or error may occur. void TcpThread::reset_loop_buf(struct _loop_buf *loop_buf) { loop_buf->rhead = 0; loop_buf->whead = 0; } void TcpThread::release_loop_buf(struct _loop_buf *loop_buf) { free(loop_buf->buf_head); } // // Return value: // 0: Success. // -1: The loop buffer is NULL. // int TcpThread::read_data_from_loop_buf(struct _loop_buf *loop_buf, void *data_unit) { if (loop_buf->rhead == loop_buf->whead) { // The buffer is null. return -1; } // // Do your work here, you can read data from the loop buffer. // Following is just an example. // // Note: // Must copy the data out, or the content of the data unit may be // overwritten. // memcpy(data_unit, (char *)loop_buf->buf_head + loop_buf->rhead * loop_buf->unit_size, (size_t)loop_buf->unit_size); if (loop_buf->rhead == (loop_buf->num_of_unit - 1)) { loop_buf->rhead = 0; } else { loop_buf->rhead++; } return 0; } // // --- IMPORTANT --- // There is no mutex to avoid race condition in the function's implementation. // So, to call this function from only one code source. // //Return value: // 0: Success. // -1: The loop buffer is full. // int TcpThread::addMessage(void *data_unit) { int tmp_whead = 0; tmp_whead = loop_buf.whead + 1; if (tmp_whead >= loop_buf.num_of_unit) { tmp_whead = 0; } if (tmp_whead == loop_buf.rhead) { // The buffer is full. return -1; } // // Do your work here, you can write data to the loop buffer. // Following is just an example. // memcpy((char *)loop_buf.buf_head + loop_buf.whead * loop_buf.unit_size, data_unit, (size_t)loop_buf.unit_size); loop_buf.whead = tmp_whead; return 0; } void TcpThread::newConnectionSlot() { //m_pEdt_Info->append(QObject::tr("有新客户端连接到服务器")); socket = tcpServer->nextPendingConnection(); connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); connect(socket, SIGNAL(readyRead()),this, SLOT(dataReceived())); } void TcpThread::dataReceived() { bytes = socket->readAll(); qDebug() << bytes.length() << bytes.size(); //if (bytes.size()=0) waitfo if (byteGet.size()!=0){ byteGet.append(bytes.left(68-byteGet.size())); bytes.remove(0,68-byteGet.size()); qDebug() << byteGet.length() << bytes.size(); } for (;bytes.size()>=68;){ byteGet = bytes.left(68); //m_pEdt_Info->append(byteGet.toHex()); bytes.remove(0,68); qDebug() << byteGet.length() << bytes.size(); } if (bytes.size()>0&&bytes.size()<68){ byteGet = bytes; bytes.remove(0,byteGet.size()); qDebug() << byteGet.toHex(); qDebug() << byteGet.length() << bytes.size(); //bytes = m_pSocket->readLine(); //m_pServer->close(); } } ``` .cpp文件 线程中接收数据,使用信号机制可不可以啊? 我用connect(socket, SIGNAL(readyRead()),this, SLOT(dataReceived())); 发现Slot里面定义的接收数据并未调用到。为什么,是this的问题,还是不应该这样使用信号机制。或者还有别的什么好方法吗,麻烦各位大神热点,感激

求助蓝牙数据流读取问题,buffer的状态是一个迷

各位大大好,我是java小白+安卓小白,最近遇到一个头疼的问题: 我在创建蓝牙连接之后,开启新线程读取数据:(以下为线程类里的代码) Thread ReadThread=new Thread(){ //开辟缓冲区buffer byte[] buffer = new byte[1024]; int k=1; int num=0; public void run(){ try { while(count==0) { Log.e(TAG, "等待"); count =is1.available(); } while(true){ Log.e(TAG, "读入数据"); Log.e(TAG, "k="+k); k++; num = inputstream.read(buffer); //读入数据 Log.e("TAG", "num="+num); Log.e("TAG", "buffer="+buffer); String ss=toHexString1(buffer);//调用byte-->string方法 //data=inputstream.read(); if(is1.available()==0){ Log.e("TAG", "break"); break; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; k是inputStream.read()执行的次数,num是读取进来的字节数量 大概就这样执行12次左右(k++到12,11次num显示为1024,最后一次只有30~50),logcat 输出“break”,也就是说此时is1.available()==0 可是我的蓝牙数据是一直不停得发送啊,求问各位大大为什么呢? 还有就是,有一次我在if(is1.available()==0)之前写了data=is1.read();就出现了 k++不停,而每一次num都是有几十,这时候数据还可靠吗?为什么会出现这种情况呢?

netty多线程通信一次传输较大数据遇到的问题

您好,刚入门netty,想请教大神们几个问题,对于只有一个线程一次传输过大的数据,通过这个方法解决了:传输时头4个字节保存数据大小,后面保存内容,接收时如果发现读取的数据长度不够,则累积到下一次读取,最后得到的message则为需要的数据。部分代码如下: 发送消息: public static void sendMsg(ChannelHandlerContext ctx,byte[] bytes){ ByteBuf buf = ctx.alloc().buffer(); buf.writeInt(bytes.length); buf.writeBytes(bytes); ctx.writeAndFlush(buf); } 接收消息: public class Decoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out) throws Exception { if (buf.readableBytes()<buf.getInt(buf.readerIndex())){ return; } out.add(buf.readBytes(buf.readableBytes())); } } 现在我有个情景是,在传输数据时是多线程的,同一个时间会多次调用ctx.writeAndFlush方法发送数据(多线程使用的是同一个ctx对象),每次发送的数据也是比较大的数据,在接收的时候,是否会出现数据混乱的情况(一次传输数据过大,会多次调用decode方法,多线程环境下是否会出现问题?),我开50个线程测试时发现if (buf.readableBytes()<buf.getInt(buf.readerIndex()))这句代码报数组越位的异常,请问有什么好的解决办法吗,感谢!

【资深的你,进来指点下】SpringMvc Controller的线程安全!

SpringMvc Controller的**线程安全**! 为什么下面的代码是线程安全的? @Controller public class UserController{ @Autowired private HttpSession session @RequestMapping(xxxxxxx){ session.get ... session.set... .... } } 大家都知道spring bean默认是单例的。但是这个地方的session对象 为什么没有线程安全问题?(经过测试) 如果是其他自定义Object 有全局属性 应该有线程安全问题(猜想) 求,牛人解答。谢谢

qt 多线程接收下位机数据写进MySQL中。

qt 多线程接收下位机数据写进MySQL中。上位机是一个多线程的服务端,想接收多个<1~100台>客户端(下位机)发来的数据(每个下位机大致有50MB的数据)。网络环境是局域网。问题1,大数据在tcpsocket上怎么发送,接收。问题2,如何多线程的写进MySQL中。问题3,传输和读写的速度需要越快越好,有大咖说这样的话可以使用索引+写硬盘。没见过呀。 希望大咖们百忙中指教哈。

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c# cad插入影像 c#设计思想 c#正则表达式 转换 c#form复制 c#写web c# 柱形图 c# wcf 服务库 c#应用程序管理器 c#数组如何赋值给数组 c#序列化应用目的博客园
立即提问