संक्षेप में, मेरे पास एक onGuildMessageReceived विधि है जो अलार्म कमांड के लिए सुनती है जिसके साथ उपयोगकर्ता एक संदेश के साथ उसे सूचित करने के लिए उलटी गिनती सेट कर सकता है। वे एक समय राशि और अंतिम अलार्म संदेश टाइप करते हैं जो उस समय के बाद उन्हें मिलने वाले पिंग के साथ आता है।

मेरा सवाल यह है कि, मैं इस सुविधा को प्रत्येक उपयोगकर्ता के लिए अलग से कैसे काम कर सकता हूं, ताकि अन्य उपयोगकर्ता पिछले अलार्म समय को ओवरराइट न करें जो पहले से ही टिक रहे थे?

उलटी गिनती शुरू करने के लिए इस विधि को मुख्य कोड में कहा जाता है।

    public void StartTimer(int seconds, GuildMessageReceivedEvent event) 
{
    timer = new Timer();
    timer.schedule(new TimerReminder(event), seconds * 1000);
}
public void StartTimer(int seconds, GuildMessageReceivedEvent event, String text) 
{
    timer = new Timer();
    timer.schedule(new TimerReminder(event, text), seconds * 1000);
}

मेरे पास यह उपवर्ग है जो .schedule() समय के बाद कोड का एक ब्लॉक करता है।

class TimerReminder extends TimerTask{
    GuildMessageReceivedEvent eventtrigger;
    String alarmText = "";
    private TimerReminder(GuildMessageReceivedEvent event) 
    {
        eventtrigger=event;
    }
    private TimerReminder(GuildMessageReceivedEvent event, String alarmArg) 
    {
        eventtrigger=event;
        alarmText=alarmArg;
        
    }
    public void run() 
    {
        if(alarmText.isEmpty()) 
        {
            eventtrigger.getChannel().sendMessage("<@"+auth+">, ***your alarm is ringing!***🔔🔔🔔🔔").queue();
            timer.cancel(); // Terminate the timer thread
            
        }
        else 
        {
            eventtrigger.getChannel().sendMessage("<@"+auth+">:\n"+alarmText).queue();
            timer.cancel(); // Terminate the timer thread
            alarmText="";
        }
    }   
}
0
Karlo Jačmenjak 19 नवम्बर 2020, 14:32

1 उत्तर

सबसे बढ़िया उत्तर

प्रत्येक कार्य के अंत में, आप timer संदर्भ पर रद्द कर रहे हैं जो वर्तमान में चल रहे टाइमर को रद्द नहीं करता है (जब तक कि कोई और आदेश नहीं चलाता) बल्कि टाइमर ऑब्जेक्ट जिसे इस समय असाइन किया गया है timer संदर्भ जो ऐसा लगता है जैसे टाइमर एक दूसरे को ओवरराइट कर रहे हैं।

और यहां तक ​​​​कि अगर आपने सभी टाइमर का संदर्भ रखा है ताकि आप उन्हें रद्द कर सकें, तो कार्य पूरा होने के बाद टाइमर को रद्द करने की कोई आवश्यकता नहीं है, टाइमर स्वयं समाप्त हो जाता है।

इसके अलावा, आपको वर्तमान में चल रहे टाइमर के लिए एक स्थिर संदर्भ रखने या उनका संदर्भ रखने की कोई आवश्यकता नहीं है। जब आप टाइमर बनाते हैं तो पृष्ठभूमि थ्रेड टाइमर और कार्य का संदर्भ रखता है ताकि उन्हें कचरा एकत्र न हो। जब कमांड चलाया जाता है, टाइमर को शेड्यूल करना और यही वह है, तो आप टाइमर को स्थानीय चर के रूप में बनाने से बेहतर होंगे। यदि आप किसी भिन्न कमांड या आपके मन में जो कुछ भी है, द्वारा टाइमर को रद्द करने की क्षमता चाहते हैं, तो आपको सभी मौजूदा टाइमर के संदर्भों के साथ एक सूची या मानचित्र रखना चाहिए ताकि यदि आवश्यक हो तो आप उन्हें रद्द कर सकें।

1
MrBorder 20 नवम्बर 2020, 17:17