Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.3 kB
2
Indexable
void BlowOrDestroyThread()
{

	while (!blowDestroyMustExit.load(std::memory_order_relaxed))
	{
		printf("BlowOrDestroyThread\n");
		if (flag.load(std::memory_order_relaxed))
		{
			//std::this_thread::sleep_for(std::chrono::milliseconds(1500));

			int add = (test::Points::startPointCount-1) * p.nodeSize;
			for (int i = 0; i < p.nodeSize; ++i)// TODO:: if I put 64 here Counter thread hangs

			{

				int range = (test::Points::startPointCount) * p.nodeSize;

				int position = p.GenerateValidPosition(p.nodeSize - 1) + add;
				if (i % 2)
				{
					std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
					int time = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
					printf("blow element position: %d, range: %d\n", position, range);
					p.SetInitDataOnPosition(position, time);



					p.AssignNewPoints(range);
					test::Points::startPointCount++;
				}
				
			    p.SetPointFlag(position, false);
			}
			flag.store(false, std::memory_order_relaxed);
		}
	}
}

// click on window initiate first points node and starts counter thread
void test::on_click(int x, int y)
{
	printf("on_click\n");
	std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

	click++;
	if (!hitOnce)
	{
		//int time = globalTime.load(std::memory_order_relaxed);
		int time = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
		p.SetInitData(x, y, time);

		p.AssignNewPoints(0);
		//printf(" 1! x: %d, y: %d range: %d\n", x, temp, range);
		Points::startPointCount++;
		counterThread = std::thread(PointsThread);
		blowDestroyThread = std::thread(BlowOrDestroyThread);
		//blowDestroyThread.detach();
		flag.store(true, std::memory_order_relaxed);
		hitOnce = true;
	}
	else if(Points::startPointCount < p.nodesSize-1)
	{
		int range = Points::startPointCount * p.nodeSize;
		int temp = 765 - y;
		printf(" 1! x: %d, y: %d range: %d\n", x, temp, range);
		//int time = globalTime.load(std::memory_order_relaxed);
		int time = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
		p.SetInitData(x, y, time);

		p.AssignNewPoints(range);
		Points::startPointCount++;

		//hitOnce = false;
		flag.store(true, std::memory_order_relaxed);
	}


}