2011-12-22 22 views
5

मेरे पास टाइमर ऐप है और टाइमर समाप्त हो जाने के बाद मैं फोन को कंपन करना चाहता हूं। जब तक ओके बटन दबाया जाता है तब तक मैं वर्तमान में ध्वनि चला सकता हूं, लेकिन यह केवल एक बार कंपन करता है। जब तक उपयोगकर्ता ठीक बटन दबाता है तब तक कंपन को दोहराया जा सकता है?संदेश बॉक्स बंद होने तक कंपन करें विंडोज फोन 7

यह मेरे वर्तमान कोड

SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 

VibrateController vibrate = VibrateController.Default; 

vibrate.Start(new TimeSpan(0,0,0,0,1000)); 

MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 

if (alarmBox == MessageBoxResult.OK) 
{ 
    alarmSound.Stop(); 
    vibrate.Stop(); 
} 

अद्यतन है: मैं जो प्रतिक्रिया है, जो काम करता है अगर मैं MessageBox.Show() यह इस बिंदु पर बंद करने के लिए जब तक ठीक दबाया जाता है लगता है कॉल नहीं करते की कोशिश की है।

+0

को साफ आप इसे लगातार कंपन, या पल्स करना चाहते हैं चाहते हो सकता है? – Joe

+0

@ जो मैं इसे – Chris

+6

पल्स करना चाहता हूं, आपको समय के बाद समय निकालना सुनिश्चित करना चाहिए, अन्यथा आप किसी ऐसे व्यक्ति के लिए बैटरी निकालने का जोखिम उठा सकते हैं जो अपने फोन को किसी अन्य कमरे में छोड़ देता है। –

उत्तर

2

VibrateController.Start(Timespan) की तरह लग रहा है, तो आप में एक मूल्य के अधिक से अधिक 5 सेकंड से भी गुजरती हैं ताकि आप रखने के लिए कुछ प्रवंचना करने की ज़रूरत है एक त्रुटि फेंक देंगे, जा रहा है। टाइमर बनाएं, और कंपन को पुनरारंभ करने के लिए सेट करें। उदाहरण के लिए:

संपादित

बेवकूफ मुझे, मैं भूल गया था कि दोनों संदेशबॉक्स, और DispatcherTimer एक ही धागे पर चलेंगे। संदेशबॉक्स इसे अवरुद्ध करेगा। इसे इस्तेमाल करे।

public partial class MainPage : PhoneApplicationPage 
{ 
    TimeSpan vibrateDuration = new TimeSpan(0, 0, 0, 0, 1000); 
    System.Threading.Timer timer; 
    VibrateController vibrate = VibrateController.Default; 
    int timerInterval = 1300; 
    SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 
    TimeSpan alramDuration; //used to make it timeout after a while 

    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     timer = new Timer(new TimerCallback(timer_Tick), null, 0, timerInterval); 
     alramDuration = TimeSpan.FromSeconds(0); 
     alarmSound.Play(); 
     MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 

     if (alarmBox == MessageBoxResult.OK) 
     { 
      StopAll(); 
     } 
    } 

    void timer_Tick(object sender) 
    { 
     //keep track of how long it has been running 
     //stop if it has gone too long 
     //otheriwse restart 

     alramDuration = alramDuration.Add(TimeSpan.FromMilliseconds(timerInterval)); 
     if (alramDuration.TotalMinutes > 1) 
      StopAll(); 
     else 
      vibrate.Start(vibrateDuration); 
    } 

    void StopAll() 
    { 
     timer.Change(Timeout.Infinite, Timeout.Infinite); 
     vibrate.Stop(); 
     alarmSound.Stop(); 
    } 
} 

तो मैं डिस्पैचर के बजाय System.Threading.Timer का उपयोग कर रहा हूं। यह मुख्य रूप से वही है, केवल एक स्पष्ट एपीआई का थोड़ा सा है। Start() and Stop() पर कॉल करने के बजाय आपको देरी राशि में गुजरना होगा। इसे शुरू करने के लिए, 0 में पारित यह हर 1.3 सेकंड बंद चलती रहेगी जब तक आप Timeout.Infinite में

कुछ बातें नोट करने के लिए गुजर Change() फोन:

  • vibrate.Start(vibrateDuration)केवल टिक से कहा जाता है घटना। ऐसा इसलिए है क्योंकि टाइमर तुरंत लात मार देगा।
  • प्रति Mystere Man's सुझाव, मैंने एक टाइमआउट जोड़ा। आपको ऐसा कुछ चाहिए।
  • आप refactor करने के लिए, और मेरे नमूना
+0

काम करने लगता है मुझे लगता है कि MessageBox.Show() इस में हस्तक्षेप करता है।यदि मैं समय और कंपन बंद करने के तरीकों को हटा देता हूं तो ठीक है बटन को – Chris

+0

@Chris दबाए जाने के बाद लगातार कंपन करना शुरू होता है यदि आप if स्टेटमेंट से स्टॉप() एस को हटाते हैं? – Joe

+0

अगर मैं स्टॉप() एस को हटा देता हूं तो ओके बटन – Chris

0
SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 

VibrateController vibrate = VibrateController.Default; 

var vibrationLength = 1000; 
var startTime = DateTime.Now; 
vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 

MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 
var ok = false; 

While (!ok){ 
    if (alarmBox == MessageBoxResult.OK) 
    { 
    ok = true; 
    } 
    else{ 
    if(startTime.AddMilliseconds(vibrationLength * 1.2) < DateTime.Now) 
    { 
     startTime = DateTimne.Now; 
     vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
    } 
    } 
} 

alarmSound.Stop(); 
vibrate.Stop(); 

मोटे तौर पर

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

यदि आप इसे पल्स करना चाहते हैं तो मैं AddMilliseconds का उपयोग करने का सुझाव दूंगा और अपनी इच्छित नाड़ी की लंबाई से अधिक लंबाई जोड़ूंगा।

एक टाइमर के बजाय

का उपयोग करके आप वर्ग नाटक इस

public class buzzz 
{ 

    MessageBoxResult alarmBox; 
    DispatchTimer alarmTimer = new DispatchTimer(); 
    var vibrationLength = 1000.0; 
    var timerIncrease = 1.2; 
    VibrateController vibrate = VibrateController.Default; 

    public buzz() 
    { 
     alarmTimer.Interval = TimeSpan.FromMillseconds(vibrationLegnth * timerIncrease); 
     alarmTimer.Tick += alarmTimer_Tick 
    } 
    public void startBuzz() 
    { 
     SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 
     vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
     alarmTimer.Start(); 
     alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 
    } 

    void alarmTimer_Tick(object sender, EventArgs e) 
     { 
      if(alarmBox == MessageBoxResult.OK) 
      { 
       alarmTimer.Stop(); 
       vibrate.Stop(); 
      } 
      else 
      { 
       vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
      } 
     } 
} 
संबंधित मुद्दे