私のネイティブ拡張では、スクリーンショットを作成します。私は同期的な方法でこれを行うことができました。今私はそれをスレッドで非同期(WINAPI CreateThreadを使用して)したいです。空気のネイティブ拡張:スレッド(winapi)からビットマップデータをas3に渡します。
スレッドでは、新しいビットマップデータを作成し、各ピクセルの色を設定します。しかし、今私の質問は:
スレッドで作成されたbitmapdataをactionscriptに渡すにはどうすればよいですか?ここで
私はスレッドを作成します。
FREObject getScreenShotAsynchronous(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
FREGetObjectAsInt32(argv[1], &_iSsWidth);
FREGetObjectAsInt32(argv[2], &_iSsHeight);
FREGetObjectAsInt32(argv[3], &_iSsOffsetX);
FREGetObjectAsInt32(argv[4], &_iSsOffsetY);
//Context ref for thread:
oCtxThreadScreenshot = ctx;
//Create thread:
bRunThreadScreenshot = true;
hThreadScreenshot = CreateThread(NULL, 0, threadScreenshot, 0, 0, &dwThreadScreenshotID);
CloseHandle(hThreadScreenshot);
return NULL;
}
そして、ここではスレッドそのものです:助けを
DWORD WINAPI threadScreenshot(LPVOID data)
{
int32_t iWidth, iHeight, iOffsetX, iOffsetY;
iWidth = _iSsWidth;
iHeight = _iSsHeight;
iOffsetX = _iSsOffsetX;
iOffsetY = _iSsOffsetY;
FREObject freWidth;
FRENewObjectFromUint32(uint32_t(iWidth), &freWidth);
FREObject freHeight;
FRENewObjectFromUint32(uint32_t(iHeight), &freHeight);
FREObject freTransparent;
FRENewObjectFromBool(uint32_t(0), &freTransparent);
FREObject freFillColor;
FRENewObjectFromUint32(uint32_t(0xFF0000), &freFillColor);
// first get those values from imaage
FREObject freArguments[4] = { freWidth, freHeight, freTransparent, freFillColor };
// create an instance of BitmapData
FREObject freoBitmapData;
FRENewObject((uint8_t *)"flash.display.BitmapData", 4, freArguments, &freoBitmapData, NULL);
// now acquire the bitmap data in order to manipulate it
FREBitmapData freBitmapData;
FREAcquireBitmapData(freoBitmapData, &freBitmapData);
//***
//Grab screenshot data and fill bitmapdata...
//**.
// Tell Flash which region of the bitmapData changes (all of it here)
FREInvalidateBitmapDataRect(freoBitmapData, 0, 0, freBitmapData.width, freBitmapData.height);
// Release our control over the bitmapData
FREReleaseBitmapData(freoBitmapData);
//Dispatch event:
FREDispatchStatusEventAsync(oCtxThreadScreenshot, (const uint8_t *)"onMsg", (const uint8_t *)"screenshot_done");
return 0;
}
ありがとう!
約読み取るドキュメントは[FREAcquireBitmapData(http://help.adobe.com/en_US/air/extensions/WSb464b1207c184b14-62b8e11f12937b86be4-7ff8.html)と言う場合 - 'FRE_WRONG_THREAD 方法は以外のスレッドから呼び出されましたランタイムがネイティブ拡張関数への未処理の呼び出しを持っているものです。 'あなたのコードは、このエラーがなくてもスレッドで動作します' FRE_WRONG_THREAD'? – RbMm
私はこのようなエラーはありません。イベント「screenshot_done」が送出されています。 – Ilyssis
一時ファイルとして保存してからas3 –