revert that idea, laggy as hell and unstable-ish. hard cap thread count. still leave conversion in addtext

This commit is contained in:
Akash Mozumdar 2018-10-04 22:10:27 -04:00
parent 68bafcdda7
commit 5f74684b46
5 changed files with 18 additions and 19 deletions

View File

@ -35,7 +35,9 @@ namespace
LOCK(hostMutex);
TextThread *it;
if ((it = textThreadsByParams[tp]) == nullptr)
OnCreate(it = textThreadsByParams[tp] = new TextThread(tp, Host::GetHookParam(tp).type));
if (TextThread::ThreadCounter < MAX_THREAD_COUNT)
OnCreate(it = textThreadsByParams[tp] = new TextThread(tp, Host::GetHookParam(tp).type));
else return Host::AddConsoleOutput(L"too many text threads: stopping");
it->AddText(text, len);
}

View File

@ -32,7 +32,7 @@ namespace Host
inline std::wstring StringToWideString(const std::string& text, UINT encoding)
{
std::wstring ret(text.size() + 1, 0);
ret.resize(MultiByteToWideChar(encoding, 0, text.c_str(), -1, ret.data(), ret.capacity()));
ret.resize(MultiByteToWideChar(encoding, 0, text.c_str(), -1, ret.data(), ret.capacity()) - 1);
return ret;
}

View File

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

View File

@ -25,7 +25,7 @@ public:
const ThreadParam tp;
inline static int FlushDelay = 250; // flush every 250ms by default
inline static int MaxBufferSize = 500;
inline static int MaxBufferSize = 200;
inline static int ThreadCounter = 0;
private:
@ -34,8 +34,10 @@ private:
std::wstring buffer;
std::wstring storage;
std::recursive_mutex ttMutex;
std::thread flusher = std::thread([] {});
HANDLE cancelFlushEvent = CreateEventW(nullptr, TRUE, TRUE, NULL);
HANDLE deletionEvent = CreateEventW(nullptr, FALSE, FALSE, NULL);
std::thread flushThread = std::thread([&] { while (WaitForSingleObject(deletionEvent, 10) == WAIT_TIMEOUT) Flush(); });
DWORD timestamp = GetTickCount();
ThreadOutputCallback Output;
DWORD status;

View File

@ -4,7 +4,7 @@
// 8/23/2013 jichi
// Branch: ITH/common.h, rev 128
enum { MESSAGE_SIZE = 500, PIPE_BUFFER_SIZE = 0x1000, SHIFT_JIS = 932 };
enum { MESSAGE_SIZE = 500, PIPE_BUFFER_SIZE = 0x1000, SHIFT_JIS = 932, MAX_THREAD_COUNT };
// jichi 375/2014: Add offset of pusha/pushad
// http://faydoc.tripod.com/cpu/pushad.htm