| 
			
				|  | Cheat Engine The Official Site of Cheat Engine
 
 
 |  
 
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| daspamer Grandmaster Cheater Supreme
 
  Reputation: 54 
 Joined: 13 Sep 2011
 Posts: 1588
 
 
 | 
			
				|  Posted: Fri Mar 06, 2020 11:29 am    Post subject: Thread helper class |     |  
				| 
 |  
				| Some threads helper class I wrote some time ago.. Might come handy when fetching information or running some task in background and what so..
 save and place in auto run or include into your project
 
  	  | Code: |  	  | threadClass = {}; local ti,tr = table.insert,table.remove;
 setmetatable(threadClass, {
 __call = function (cls, ...)
 return threadClass.new(...);
 end,
 })
 
 function threadClass.new(init)
 local totalThreads = 0;
 local self = setmetatable({}, {
 __call = function (cls, ...)
 print("total threads #",tostring(totalThreads));
 end
 })
 self.__index = self;
 self.threads = {};
 self.suspended = false;
 local callback = function(thread,id)
 self.doQueue(id,thread);
 end
 self.createThread = function(id)
 if(not id or (tonumber(id) and self.threads[id])) then -- we must assign id for the thread, and make sure that id is not used --> if used obtain new id for us
 local _id = 0;
 while true do
 _id = _id + 1;
 if (not self.threads[_id]) then
 id = _id;
 break;
 end
 end
 end
 local thread = createNativeThreadSuspended(function (thread) callback(thread,id) end);
 thread.name = "Thread helper #"..id;
 self.threads[id] = {id = id, thread = thread,suspended = true,start = os.clock(), queue = {}};
 local tthreads = self.threads[id];
 tthreads.getId = function () return id end;
 tthreads.hasQueue = function () return self.hasQueue(id) end;
 tthreads.getQueue = function () return tthreads.queue end;
 tthreads.suspendThread = function () thread.suspend(); tthreads.suspended = true; return true; end;
 tthreads.resumeThread = function () thread.resume(); tthreads.suspended = false; return true; end;
 tthreads.destroyThread = function () return self.destroyThread(id) end;
 tthreads.destroyQueue = function () return self.destroyQueue(id) end;
 tthreads.addQueue = function (func) return self.addQueueEx(id,func); end;
 tthreads.doQueue = function() tthreads.resumeThread(); return end;
 totalThreads = totalThreads + 1;
 return self.threads[id],id;
 end
 self.getTotalThreads = function()
 return totalThreads;
 end
 self.getThreadById = function(id)
 return self.threads[id] or nil;
 end
 self.getIdByThread = function(thread)
 if (not thread) then
 return nil;
 end
 for id,threadObj in pairs(self.threads) do
 if (threadObj.thread == thread) then
 return id;
 end
 end
 return false;
 end
 self.AutoCreateThreads = function()
 local total = (os.getenv("NUMBER_OF_PROCESSORS")//2 or 1);
 for i=1,total do
 self.createThread();
 end
 end
 self.getActive = function ()
 return not self.suspended;
 end
 self.setActive = function (state)
 if (type(state)=='boolean') then
 self.suspended = not state;
 else
 self.suspended = not self.suspended;
 end
 if (self.suspended) then
 return self.SuspendAllThreads();
 else
 return self.ResumeAllThreads();
 end
 end
 self.SuspendAllThreads = function()
 for k,v in pairs(self.threads) do
 if (not v.suspended) then
 v.thread.suspend();
 v.suspended = true;
 end
 end
 return true;
 end
 self.hasQueue = function(id)
 return self.getQueueSize(id) > 0;
 end
 self.getQueueSize = function(id)
 local threadObj = self.threads[id];
 if (not (threadObj and threadObj.queue)) then
 return 0;
 end
 return #threadObj.queue;
 end
 self.ResumeAllThreads = function()
 for k,v in pairs(self.threads) do
 if (v.suspended and self.hasQueue(v.id)) then
 v.suspended = false;
 v.thread.resume();
 end
 end
 return true;
 end
 self.destroy = function(force)
 if (force) then
 self.SuspendAllThreads();
 for k,v in pairs(self.threads) do
 pcall(v.thread.terminate);
 end
 self.threads = {};
 totalThreads = 0;
 return true;
 end
 for id,threadObj in pairs(self.threads) do
 if (self.destroyThread(id)) then
 totalThreads = totalThreads-1
 end
 end
 return totalThreads == 0;
 end
 self.doQueue = function(id,thread)
 local threadObj = self.threads[id];
 if (not (threadObj and threadObj.queue)) then
 return false;
 end
 local queue = threadObj.queue;
 while true do
 local func = queue[1];
 if (func and type(func)=='function') then
 pcall(func,threadObj.thread,id);
 tr(queue,1);
 elseif(func == "__exit") then
 tr(queue,1);
 self.threads[id] = nil;
 totalThreads = totalThreads - 1;
 -- if thread then
 -- thread.terminate();
 -- end
 break;
 elseif(not threadObj.suspended) then
 threadObj.suspended = true;
 threadObj.thread.suspend();
 -- break;
 elseif(inMainThread()) then -- Calling this function directly from main thread, without resuming worker thread will cause infinite loop.
 break;
 end
 end
 -- self.destroyThread(id);
 end
 self.destroyQueue = function(id)
 local threadObj = self.threads[id];
 if (not (threadObj and threadObj.queue)) then
 return false;
 end
 local shouldresume = false;
 if(not threadObj.suspended) then
 shouldresume = true;
 threadObj.thread.suspend();
 end
 for key in pairs(threadObj.queue) do
 threadObj.queue[key] = nil;
 end
 if (shouldresume) then
 threadObj.thread.resume();
 end
 return true;
 end
 self.destroyThread = function(id)
 local threadObj = self.threads[id];
 if (not (threadObj and threadObj.thread)) then
 return false;
 end
 return (self.destroyQueue(id) and self.addQueueEx(id,"__exit"));
 end
 self.addQueueEx = function(id,func)
 local threadObj = self.threads[id];
 if (not (func and threadObj and threadObj.thread)) then
 return false;
 end
 ti(threadObj.queue,func);
 if (threadObj.suspended and not self.suspended) then
 threadObj.suspended = false;
 threadObj.thread.resume();
 end
 return true;
 end
 
 self.addQueue = function(func)
 local id,total;
 for _id,threadObj in pairs(self.threads) do
 if (threadObj.suspended and not self.suspended) then
 id = _id;
 break;
 elseif((not total) or self.getQueueSize(_id) < total) then
 total = self.getQueueSize(_id);
 id = _id;
 end
 end
 return self.addQueueEx(id,func);
 end
 return self;
 end
 return threadClass;
 | 
 
 
 Some example usage and explanation
 
  	  | Code: |  	  | --[[ threadClass(); --> returns threads class object
 Methods:
 obj.createThread(id) : thread; assigned id --> id is optinal
 obj.getTotalThreads() : integer
 obj.getThreadById(id) : integer
 obj.getIdByThread(thread) : integer
 obj.AutoCreateThreads() : nil
 obj.doQueue(id) : nil --> should not be used! only for debugging purposes
 obj.destroy(force) : boolean --> destroys all threads, does not destroy the class
 obj.destroyQueue(id) : boolean
 obj.destroyThread(id) : boolean
 obj.addQueueEx(id,func) : boolean
 obj.addQueue(func) : boolean
 obj.setActive(state) : boolean -->suspends/resumes all threads (threads with no queue won't be resumed)
 obj.getActive() : boolean -->status if class is active, all threads are suspended or resumed
 obj.SuspendAllThreads() : boolean --> adding new queue will resume, unlike setActive(false) which will not resume anythread unless thread.resumeThread() or class.ResumeAllThreads() is called
 obj.ResumeAllThreads() : boolean
 obj.hasQueue(id) : boolean
 --]]
 --[[
 -- Usage
 threads = threadClass();
 threads(); --> total threads # 0
 threads.AutoCreateThreads(); -- creates threads half of the the cpu threads count
 threads(); --> total threads # 4; on desktop i7-4970k
 -- threads.addQueue(function()
 -- action that you wish to do
 -- do not forget to use synchronize if it's GUI related
 -- end);
 -- threads.destroyThread(4) --> destroys last thread
 
 
 -- ###Example###
 -- the following script will add useless actions for the threads
 -- the action contains sleep to delay and allow the script to assign the next action to the least queued thread
 t = createTimer(nil)
 t.Interval = 50;
 v={}
 local i = 0;
 t.onTimer = function()
 i=i+1;
 threads.addQueue(function (thread,id) _x = (_x or 0) + 1; print("COUNT ",_x,", ID - ",id); sleep(math.random(100,500)*(id));
 v[id] = (v[id] or 0)+1; --> total count of calls ordered by ID
 end)
 if(i>=50)then
 t.destroy(); -->destroy timer
 end
 end
 
 -- now running this as soon as it's finished running all events (we have to wait or write a function that holds the thread until all other are finished)
 for k,v in pairs(v) do
 print("id ",k," = ",v);
 end
 -- output I got for running the script above, since the higher the id the higher the delay (delay sum is randomized and multiplied by id)
 -- id  1  =  17
 -- id  2  =  12
 -- id  3  =  11
 -- id  4  =  10
 -- rerunning the script output me this
 -- id  1  =  17
 -- id  2  =  13
 -- id  3  =  10
 -- id  4  =  10
 -- increasing timerInterval (causing higher delay between queue placement but allows threads to reduce the queue size drastically)
 -- to 150(3x more delay) yields this output
 -- thread 4 takes at most 4x more time to execute comparing to thread 1, thats why thread 1 executed 4.333x more commands
 -- id  1  =  26
 -- id  2  =  10
 -- id  3  =  8
 -- id  4  =  6
 --]]
 
 | 
 Additional example;
 
  	  | Code: |  	  | local threads = myThreads
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 threads.SuspendAllThreads(); -- suspends all the threads; any queue added afterwards will resume a thread;
 threads.getThreadById(1).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(1).queue); end)
 threads.getThreadById(2).addQueue(function (thread,threadid) for i=1,15 do sleep(math.random(1,100)*threadid); print("Test",threadid,'\t', os.clock()); end; print('Thread -',threadid,'   queue left=',#threads.getThreadById(2).queue); end)
 --]]
 | 
 _________________
 
 I'm rusty and getting older, help me re-learn lua. |  |  
		| Back to top |  |  
		|  |  
		| SuperCheats How do I cheat?
 
 ![]() Reputation: 0 
 Joined: 06 Aug 2020
 Posts: 2
 
 
 | 
			
				|  Posted: Thu Aug 06, 2020 3:30 pm    Post subject: Trainer without adobe flash player operation |   |  
				| 
 |  
				| Hello brother Sorry for my bad English, I want you to help me with a project, before using your game trainer generator with Adobe Flast Player, but now there are several factors and also in a short time the adobe flast player will be removed. I have some codes that I don't want to share from the group of 8 balls that used to have Adobe Flast, so now you can't do an automatic hack without Adobe Flast Player, in conclusion I want you to help me create a trainer to hack any process, so that the game doesn't need Adobe Flast Player to be detected, even if people have to search for the manual process |  |  
		| Back to top |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 You cannot attach files in this forum
 You can download files in this forum
 
 |  |