में एक विधि को सीमित करने का समय मेरे पास एक गेम फ्रेमवर्क है जहां आईबॉटइंटरफेस को लागू करने वाले बॉट्स की एक सूची है। ये बॉट उपयोगकर्ता द्वारा बनाई गई एकमात्र सीमा के साथ कस्टम हैं जिन्हें उन्हें इंटरफ़ेस को लागू करना होगा।सी #
गेम फिर आपके टर्न और राउंड स्टार्ट जैसी विभिन्न घटनाओं के लिए बॉट्स (उम्मीदवारों में समानांतर) में विधियों को कॉल करता है। मैं चाहता हूं कि बॉट कंप्यूटिंग छोड़ने के लिए मजबूर होने से पहले इन घटनाओं को संभालने में सीमित समय बिताएं।
बात मैं कोशिश कर रहा हूँ की तरह का एक उदाहरण है: (जहां newgame एक प्रतिनिधि है)
Parallel.ForEach(Bots, delegate(IBot bot)
{
NewGame del = bot.NewGame;
IAsyncResult r = del.BeginInvoke(Info, null, null);
WaitHandle h = r.AsyncWaitHandle;
h.WaitOne(RoundLimit);
if (!r.IsCompleted)
{
del.EndInvoke(r);
}
}
);
इस मामले में मैं EndInvoke() जो समाप्त नहीं हो सकता है चलाने के लिए मजबूर कर रहा हूँ। मैं थ्रेड को साफ करने के तरीके के बारे में सोच नहीं सकता।
यह अगर वहाँ
try {
bot.NewGame(Info);
} catch (TimeOutException) {
// Tell bot off.
} finally {
// Compute things.
}
किसी तरह का था बहुत अच्छा होगा लेकिन मुझे लगता है इसके संभावित इस तरह के एक निर्माण करने के लिए नहीं है।
इसका उद्देश्य शान से ऐ के जो आकस्मिक अनंत लूप है या एक लंबे समय की गणना करने के ले जा रहे हैं संभाल करने के लिए है।
इस से निपटने के कुछ इस तरह (के साथ और अधिक C# और कम स्यूडोकोड) के लिए किया जाएगा का एक अन्य संभावित रास्ता
Class ActionThread {
pulbic Thread thread { get; set; }
public Queue<Action> queue { get; set; }
public void Run() {
while (true) {
queue.WaitOne();
Act a = queue.dequeue();
a();
}
}
Class foo {
main() {
....
foreach(Bot b in Bots) {
ActionThread a = getActionThread(b.UniqueID);
NewGame del = b.NewGame;
a.queue.queue(del);
}
Thread.Sleep(1000);
foreach (ActionThread a in Threads) {
a.Suspend();
}
}
}
नहीं स्पष्ट तरीका है, लेकिन यह काम करेगा। (मैं इस बारे में चिंता करूंगा कि पैरामीटर को कैसे पास किया जाए और बाद में वापसी मूल्यों को कैसे लें)।
[आगे संपादित करें]
मैं भी यकीन है कि क्या एक appdomain यह दिखता है मैं ऐसा कर सकता है से, है नहीं कर रहा हूँ, लेकिन यह नहीं कर सकते देखें कि यह कैसे मदद मिलेगी
मुझे उम्मीद नहीं की उम्मीद गलत मंशा वाला कोड। अन्य बॉट थ्रेड को मारने की कोशिश करना खेल जीतने का एक वैध तरीका नहीं है। मैं बस गणना करने के लिए प्रत्येक बॉट को एक सेकंड देना चाहता था, फिर गेमफ्लो के साथ आगे बढ़ना ताकि मुख्य रूप से धीमी या बग कोड की अपेक्षा हो।
मैं क्या मैंने कहीं धीरे-धीरे हो रही टास्क के साथ कर सकते हैं, को देखने के लिए कोशिश कर रहा हूँ।
मैं कैस क्या कर सकते हैं में पढ़ा होगा, तुम लोगों
धन्यवाद [अधिक संपादित करें]
मेरा सिर, दर्द होता है मैं अब और नहीं लगता है कि या कोड नहीं कर पा रहे। मैं बॉट प्रति एक समर्पित धागा के लिए एक संदेश पारित प्रणाली की स्थापना कर रहा हूँ और निलंबित कर देगा/उन धागे
मैंने तय किया है कि मैं एक पूरी तरह से कूबस्थित सर्वर क्लाइंट सिस्टम का उपयोग करेगा सोते हैं। ताकि ग्राहक जो चाहे वह कर सके और मैं केवल अनदेखा कर दूंगा अगर यह सर्वर संदेशों का जवाब देने से इंकार कर देता है। करुणा इसे इस पर आना पड़ा।
आप इसे यहां पूछना चाहेंगे: http://gamedev.stackexchange.com/ – jjnguy
क्या आप उन्हें किसी अन्य एपडोमेन में चला सकते हैं? –
@ जस्टिन, क्यों? थोड़ा सा रिकॉर्डिंग के साथ, यह सिर्फ एक प्रोग्रामिंग समस्या है। किसी थ्रेड पर विधि को कैसे कॉल करें, कुछ समय बाद इसे साफ़ करने में सक्षम होना। –