Sqlite中Blob在Android里读取的问题 |
答題得分者是:aftcast
|
Fangaofeng
一般會員 發表:1 回覆:2 積分:0 註冊:2015-02-05 發送簡訊給我 |
TThread.CreateAnonymousThread(procedure ()
var Index ,nCount:Integer; mItem : TMetropolisUIListBoxItem; jpgStream:TMemoryStream; begin nCount := dmAndroid.tblArtBasicInfo.RecordCount; if nCount > 0 then Begin for Index := 1 to nCount do begin jpgStream := TMemoryStream.Create; mItem := TMetropolisUIListBoxItem.Create(lbxArtInfo); mItem.Title := dmAndroid.tblArtBasicInfo.FieldByName('ArtNo').AsString; mItem.SubTitle := dmAndroid.tblArtBasicInfo.FieldByName('GroupName').AsString; mItem.Text := dmAndroid.tblArtBasicInfo.FieldByName('ArtNO').AsString; mItem.Description := dmAndroid.tblArtBasicInfo.FieldByName('ArtName').AsString; mItem.Name:= 'Item' IntToStr(Index); TBlobField(dmAndroid.tblArtBasicInfo.FieldByName('iPhoto')).SaveToStream(jpgStream); mItem.Icon.LoadFromStream(jpgStream); lbxArtInfo.AddObject(mItem); dmAndroid.tblArtBasicInfo. Next; jpgStream.DisposeOf; end; End; end).Start;
上面程式在Win32下運行正常,在Android下無任何提示,註釋掉此行 TBlobField(dmAndroid.tblArtBasicInfo.FieldByName('iPhoto')).SaveToStream(jpgStream)后就可正常運行,請問是什麼問題? |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
可以再次確認一下是下面哪一行嗎?
(1)TBlobField(dmAndroid.tblArtBasicInfo.FieldByName('iPhoto')).SaveToStream(jpgStream); (2)mItem.Icon.LoadFromStream(jpgStream);
只註解(2) 會不會錯? (我會這樣問是曾遇到類似的,是load的時候出問題) 此外,正常來說,(2)的上面是否該有 jpgStream.Position := 0; 這行? 確認上述二個問題,再討論一下,ok?
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
Fangaofeng
一般會員 發表:1 回覆:2 積分:0 註冊:2015-02-05 發送簡訊給我 |
注解(1)就OK了,但是我要這行的, jpgStream.Position := 0 也不行
編輯記錄
Fangaofeng 重新編輯於 2015-02-06 16:39:43, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
再仔細看你的程式,並思考後,我大概知道問題了。
在你的程式裡,用了二個 "全域" 的變數 dmAndroid.tblArtBasicInfo lbxArtInfo 你必需確保它們是 thread-safe 的。 我不清楚它們是或不是,但照你目前run的情形,理當第一個應該就不是安全的… 以上是目前單從你程式碼上看來的合理解釋。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
最後補充一個 相關的 情形。
就在昨天的時候,幫一個朋友處理一件程式問題。最後發現 imgCameraImage->Bitmap->LoadFromStream(FParsedData); //(imgcameraimage 是一個 timage) 上面那行在 thread 中跑。 在window上 一切正常。 camera 的畫面都出現。 但到了 android,一切無畫面,全卡在那一行上… 後來我把它加入 "同步" 後,不管是win上,mac上,ios上,android,通通都ok。 所以,我想說的是,不能因為 windows正常就認定它是 thread-safe的,我是不清楚 windows為何會耐受力好。也許是fmx本身的寫法,也可能是因為 桌機的cpu速度,等等都有可能使得" 看起來 " 正常。或是在某些機器上或裝置上正常。那些正常都像是 "剛好" 正常的情形。 以上分享。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
可把有問題的包起來:
TThread.Synchronize(nil, procedure begin Form1.Memo1.Lines.Add(IntToStr(FThreadID) ' : ' DateTimeToStr(Now)); end); 依樣畫xx,你的情形應可試: TThread.Synchronize(nil, procedure begin TBlobField(dmAndroid.tblArtBasicInfo.FieldByName('iPhoto')).SaveToStream(jpgStream); end); 試看看
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
Fangaofeng
一般會員 發表:1 回覆:2 積分:0 註冊:2015-02-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |