void Update()
{
while (true)
{
DateTime start = DateTime.Now;
// Copy the events list locally
mEventQueueLock.WaitOne();
List<EventInfo> events = mEventQueue;
mEventQueue = new List<EventInfo>();
mEventQueueLock.ReleaseMutex();
// Send data to database
string sql = "";
try
{
foreach (EventInfo e in events)
{
sql = string.Format("INSERT INTO events (timestamp, type, event) VALUES ('{0}', '{1}', '{2}')", e.mTime.ToString("yyyy-MM-dd HH:mm:ss"), (int)e.mType, e.mEventData);
MySqlCommand cmd = new MySqlCommand(sql, mSql);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
Email.SendErrorEmail(sql + "\n\n" + ex.ToString());
}
// Copy the client work list
mClientWorkQueueLock.WaitOne();
List<ClientWork> cw = mClientWorkQueue;
mClientWorkQueue = new List<ClientWork>();
TimeSpan interval = DateTime.Now - mIntervalStart;
mIntervalStart = DateTime.Now;
mClientWorkQueueLock.ReleaseMutex();
try
{
// Collect information into products
Dictionary<string, Product> products = new Dictionary<string, Product>();
foreach (ClientWork w in cw)
{
if (!products.ContainsKey(w.mProductName))
{
// Add this product
Product p = new Product();
p.mMember = GetMemberId(w.mMemberName);
p.mProduct = GetProductId(w.mProductName, p.mMember);
p.mHashes = 0;
products[w.mProductName] = p;
}
Product prod = products[w.mProductName];
prod.mHashes += w.mHashes;
products[w.mProductName] = prod;
}
// Write entries into the database for each prodcut
string timeString = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss");
foreach (KeyValuePair<string, Product> kv in products)
{
ulong hashrate = (ulong)(kv.Value.mHashes / interval.TotalSeconds);
sql = string.Format("INSERT INTO workdata (member_id, product_id, hashrate, timestamp) VALUES ('{0}', '{1}', '{2}', '{3}')", kv.Value.mMember, kv.Value.mProduct, hashrate, timeString);
MySqlCommand cmd = new MySqlCommand(sql, mSql);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
Email.SendErrorEmail(sql + "\n\n" + ex.ToString());
}
TimeSpan duration = DateTime.Now - start;
double secondsRemaining = 60 - duration.TotalSeconds;
if (secondsRemaining < 0)
{
Console.WriteLine("Log thread took {0} seconds, yeilding and going again", (int)duration.TotalSeconds);
Thread.Sleep(10);
}
else
{
Console.WriteLine("Log Thread sleeping for {0} seconds", (int)secondsRemaining);
Thread.Sleep((int)secondsRemaining * 1000);
}
}
}