// CrossThreadProgress.h

#ifndef __CROSSTHREADPROGRESS_H
#define __CROSSTHREADPROGRESS_H

#include "../../ICoder.h"
#include "../../../Windows/Synchronization.h"
#include "../../../Common/MyCom.h"

class CCrossThreadProgress:
  public ICompressProgressInfo,
  public CMyUnknownImp
{
public:
  const UInt64 *InSize;
  const UInt64 *OutSize;
  HRESULT Result;
  NWindows::NSynchronization::CAutoResetEvent ProgressEvent;
  NWindows::NSynchronization::CAutoResetEvent WaitEvent;

  HRes Create()
  {
    RINOK(ProgressEvent.CreateIfNotCreated());
    return WaitEvent.CreateIfNotCreated();
  }
  void Init()
  {
    ProgressEvent.Reset();
    WaitEvent.Reset();
  }

  MY_UNKNOWN_IMP

  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
};

#endif
