rearrange textthread logic. dont have threads where not needed.

This commit is contained in:
Akash Mozumdar 2018-10-04 19:52:16 -04:00
parent 2947c5a497
commit effe03fd96
2 changed files with 20 additions and 16 deletions

View File

@ -10,10 +10,9 @@ TextThread::TextThread(ThreadParam tp, DWORD status) : handle(ThreadCounter++),
TextThread::~TextThread() TextThread::~TextThread()
{ {
SetEvent(deletionEvent); SetEvent(cancelFlushEvent);
flushThread.join(); flusher.join();
CloseHandle(deletionEvent); CloseHandle(cancelFlushEvent);
LOCK(ttMutex);
} }
std::wstring TextThread::GetStore() std::wstring TextThread::GetStore()
@ -27,10 +26,7 @@ void TextThread::Flush()
std::wstring sentence; std::wstring sentence;
{ {
LOCK(ttMutex); LOCK(ttMutex);
if (buffer.size() < MaxBufferSize && (GetTickCount() - timestamp < FlushDelay || buffer.size() < 2)) return; sentence = buffer;
sentence = status & USING_UNICODE
? std::wstring((wchar_t*)buffer.data(), buffer.size() / 2)
: StringToWideString(std::string(buffer.data(), buffer.size()), status & USING_UTF8 ? CP_UTF8 : SHIFT_JIS);
buffer.clear(); buffer.clear();
} }
AddSentence(sentence); AddSentence(sentence);
@ -46,9 +42,19 @@ void TextThread::AddSentence(std::wstring sentence)
void TextThread::AddText(const BYTE* data, int len) void TextThread::AddText(const BYTE* data, int len)
{ {
if (buffer.size() > MaxBufferSize) Flush();
SetEvent(cancelFlushEvent);
flusher.join();
flusher = std::thread([&]
{
ResetEvent(cancelFlushEvent);
WaitForSingleObject(cancelFlushEvent, FlushDelay);
Flush();
});
LOCK(ttMutex); LOCK(ttMutex);
buffer.insert(buffer.end(), data, data + len); buffer += status & USING_UNICODE
timestamp = GetTickCount(); ? std::wstring((wchar_t*)data, len / 2)
: StringToWideString(std::string((char*)data, len), status & USING_UTF8 ? CP_UTF8 : SHIFT_JIS);
} }
// EOF // EOF

View File

@ -10,6 +10,7 @@
class TextThread class TextThread
{ {
typedef std::function<std::wstring(TextThread*, std::wstring)> ThreadOutputCallback; typedef std::function<std::wstring(TextThread*, std::wstring)> ThreadOutputCallback;
public: public:
TextThread(ThreadParam tp, DWORD status); TextThread(ThreadParam tp, DWORD status);
~TextThread(); ~TextThread();
@ -17,7 +18,6 @@ public:
std::wstring GetStore(); std::wstring GetStore();
void AddText(const BYTE* data, int len); void AddText(const BYTE* data, int len);
void AddSentence(std::wstring sentence); void AddSentence(std::wstring sentence);
void RegisterOutputCallBack(ThreadOutputCallback cb) { Output = cb; } void RegisterOutputCallBack(ThreadOutputCallback cb) { Output = cb; }
const int64_t handle; const int64_t handle;
@ -31,13 +31,11 @@ public:
private: private:
void Flush(); void Flush();
std::vector<char> buffer; std::wstring buffer;
std::wstring storage; std::wstring storage;
std::recursive_mutex ttMutex; std::recursive_mutex ttMutex;
std::thread flusher = std::thread([] {});
HANDLE deletionEvent = CreateEventW(nullptr, FALSE, FALSE, NULL); HANDLE cancelFlushEvent = CreateEventW(nullptr, TRUE, TRUE, NULL);
std::thread flushThread = std::thread([&] { while (WaitForSingleObject(deletionEvent, 10) == WAIT_TIMEOUT) Flush(); });
DWORD timestamp = GetTickCount();
ThreadOutputCallback Output; ThreadOutputCallback Output;
DWORD status; DWORD status;