2017-02-22 5 views
0

내 기본 확장 방송에서 스크린 샷을 만들고 싶습니다. 나는 이것을 동기식으로 처리했다. 이제 스레드에서 비동기식 (WINAPI CreateThread 사용)하고 싶습니다.기본 네이티브 확장 : 스레드 (winapi)에서 비트 맵 데이터를 as3으로 전달합니다.

스레드에서 새 비트 맵 데이터를 만들고 각 픽셀의 색을 설정합니다. 하지만 지금 내 질문은 :

어떻게 스레드에서 만든 bitmapdata를 다시 actionscript로 전달합니까? 도움을

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; 
} 

감사 : 스레드 자체가 여기

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; 
} 

을 그리고 다음은

나는 스레드를 만들!

+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 : 인/아웃에서 표준은 옵션이 될 수 있을까요 ...?
  • return : ANE의 기능이 null0 대신 bitmapData로 간단하게 return 일 수 있습니까? 나는 ANE를 사용하지 않으므로 어쩌면 내가 틀리다 & 그런 식으로 보관해야합니까?

표준은 인/아웃에 나는 그것의 데이터를 수신 & 외부 프로그램을 실행하는 데 NativeProcess를 사용하는 경우에서 온다. 프로세스 스레드는 실제로 실행중인 프로그램 일 뿐이므로 std 기능을 사용하면됩니다. 읽을 문서에 대해 말한다면

+0

이벤트 (문자열)를 주 스레드로 보내는 데 문제가 없습니다. 그러나 그것은 비트 맵 데이터가 아닙니다. – Ilyssis