2017-02-22 14 views
0

私のネイティブ拡張では、スクリーンショットを作成します。私は同期的な方法でこれを行うことができました。今私はそれをスレッドで非同期(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; 
} 

ありがとう!

+0

約読み取るドキュメントは[FREAcquireBitmapData(http://help.adobe.com/en_US/air/extensions/WSb464b1207c184b14-62b8e11f12937b86be4-7ff8.html)と言う場合 - 'FRE_WRONG_THREAD 方法は以外のスレッドから呼び出されましたランタイムがネイティブ拡張関数への未処理の呼び出しを持っているものです。 'あなたのコードは、このエラーがなくてもスレッドで動作します' FRE_WRONG_THREAD'? – RbMm

+0

私はこのようなエラーはありません。イベント「screenshot_done」が送出されています。 – Ilyssis

+0

一時ファイルとして保存してからas3 –

答えて

0
  • std.IN/OUT:/アウトでのstdオプションをだろうか...?
  • return:ANEの機能でnull0の代わりにreturnビットマップデータを使用することは可能でしょうか?私はANEを使用しないので、多分私は間違っている&それはそのように保管する必要がありますか? /アウトで

stdが、私はそのデータを受信&外部プログラムを実行するためにNativeProcessを使用するときから来ています。プロセススレッドは実際には実行中のプログラムなので、stdの機能を使用するとうまくいけばうまくいきます。

+0

イベント(文字列)をメインスレッドにディスパッチする際に問題はありません。しかし、それはビットマップデータではありません。 – Ilyssis

関連する問題