Bionic

程式在crash的時候,可以利用WinDbg或其他的Tool如Debug Diagnostic Tool v1.1抓取dmp file,再利用WinDbg來解析出call stack.

由於解析出的Call stack可能沒有Symbol資訊,沒辦法顯示出正確的function call,於是我們可以利用visual studo的反組譯功能來解析。

例如以下Call stack

我們要找出PP_x64!PP_Instance_DeInit+0x1b40 實際呼叫的function.

先設斷點斷在Library最一開始的位置

--

--

issue description : 傳遞參數時,裡面型態為struct的參數,此參數的量大概為1M,在傳遞的時候都使用pass by value的方法,多呼叫了幾次,在Lenovo i10 online run起來後,畫面全黑,沒有跑log,看起來是crash. (offline跑看起來沒有問題)

於是我們就做實驗把argument從pass by value改成pass by reference

再重新跑一次,就沒有當機了。

傳遞參數的時候如果太大,盡量用pointer傳遞,避免stack overflow.

--

--

問題描述

資料庫欄位型態裡面設定的型態是varchar

但在php裡面取值時(如下面程式碼),有可能取到integer的型態

$array_function = array();
for($i=0;$i<$dataCount;$i++){
$result_arr = mysqli_fetch_assoc($result);
$fn = $result_arr['function_name'];
$array_function[$fn] = array();
}

查了以後發現即使你mysql裡面設定是varchar,但你用php取值後,若是你的資料是整數,他還是會認成是整數的型態

--

--

使用QAbstractVideoSurface的繼承方法,dispatch給QCamera的類別,來獲取攝影機的圖像,這個方法可以獲取攝影機的每一幀,但CPU使用率可能很高。

在qmake(.pro檔案)加入需要的鏈結

QT += multimedia multimediawidgets

new一個QCamera物件

QCamera *m_camera = new QCamera();

因為這邊我們透過Qcamera來取得影像,可以把它想成是一個取圖的物件,透過他這個物件我們可以把攝影機呼叫出來

對這個QCamera進行設定

你可以透過QCameraViewfinderSettings來把像是resolution、格式、Frame rate等資訊設置到QCamera裡面

QCameraViewfinderSettings VfSettings;//VfSettings.setResolution(preferred_resolution);VfSettings.setPixelFormat(QVideoFrame::Format_YUYV);//QVideoFrame::Format_YUYV);//VfSettings.setMaximumFrameRate(15);m_camera->setViewfinderSettings(VfSettings);//設定當前相機的取景器

加入繼承自QAbstractVideoSurface的子類別

透過QCamera的setViewfinder來設置他的輸出方式

QCamera裡面的setViewfinder overload三個函式,通常情況下要簡單的顯示Camera會使用QCameraViewfinder(繼承至QVideoWidget)來設置,比方說下面這段code

camera = new QCamera(this);viewfind = new QCameraViewfinder();viewfind->show();camera->setViewfinder(viewfind);camera->start();

這邊我們就能直接用viewfind show出圖像來

但我們這邊會用QAbstractVideoSurface來設置,如下面這段code

    m_cameraCapture = new QtCameraCapture;
m_camera->setViewfinder(m_cameraCapture);
connect(m_cameraCapture, SIGNAL(frameAvailable(QVideoFrame&)), this, SLOT(grabImage(QVideoFrame&)));
m_camera->start();

而我們需要自己另外再render

QCamera與QAbstractVideoSurface的關係

上面透過了QCamera的setViewfinder把QAbstractVideoSurface的子類作為接口設定進去

若有影像輸入,QAbstractVideoSurface便會呼叫present這個function

bool QtCameraCapture::present(const QVideoFrame &frame)
{
if (frame.isValid()) {
QVideoFrame cloneFrame(frame);
emit frameAvailable(cloneFrame);
return true;
}
return false;
}

emit會觸發frameAvailable的signal,而執行grabImage這個callback function.

將獲取到的影像轉換格式

觸發callback function後獲取到的影像為QVideoFrame的型態,透過frame->bits(),我可以取得影像的指標,而因為我設定的影像格式是YUYV,所以我實作了一個function把YUYV轉成RGB888,再指回給QImage

--

--