來自Java環境(特別是Android)我從來沒有任何問題在新線程中執行一些代碼而不阻塞主線程。因爲我現在必須使用C++,所以我偶然發現了這個問題。C++串口線程執行器
客戶端代碼執行我的家鄉(C++)代碼通過JNI:
JNIEXPORT jbyteArray JNICALL
Java_com_native_project_NativeInterface_processData(JNIEnv *env, jobject instance, jbyteArray inputData_) {
vector<unsigned char> inputData = jbyteArrayToBytes(env, inputData_);
const vector<unsigned char> &result = getDataProcessor(env, instance).processData(inputData);
return bytesTojbyteArray(env, result);
}
DataProcessor getDataProcessor(JNIEnv *env, jobject instance) {
return DataProcessor(env, instance);
}
然後在我的DataProcessor
我希望做兩個thigs:
- 過程中的數據,並儘快返回它
- 將數據寫入活動日誌(例如數據庫)而不延遲響應(所以首先返回響應然後記錄數據)
示例代碼:
class BasicAsync {
private:
void logToDB(const vector<unsigned char> &inputData) {
// connect to DB and write data to it
}
vector<unsigned char> compute(const vector<unsigned char> &inputData) {
vector<unsigned char> result = vector<unsigned char>();
// rocket-science computation in here
return result;
}
public:
vector<unsigned char> processData(const vector<unsigned char> &inputData) {
// perform data computation and produce output
vector<unsigned char> result = compute(inputData);
// create a thread that writes the data to activity log without delaying the response return
logToDB(inputData);
//return result while data is written to activity log
return result;
}
}
我主要concers是:
- 是否有可能在C++(我使用C++ 11)?
- 如果將數據寫入數據庫需要一段時間,那麼在此期間對象會發生什麼情況(因爲在它的生命週期結束時通過JNI返回響應後應該銷燬 - 也許我在這裏丟失了某些內容)?
- 是否有任何串行線程執行程序,以便我可以向數據庫寫入一些內容(它們將被放入FIFO隊列並在同一線程中依次保存)?
我不知道jni,b您可以創建一個寫入數據庫的線程並立即將其分離。 – MikeMB
但是,請注意創建一個線程是一個代價高昂的操作,因此如您所建議的那樣,使用單個專用線程進行日誌記錄的話肯定會更高效。 – MikeMB