2012-12-03 27 views
6

क्या मैटलैब स्क्रिप्ट के लिए एक ही समय में दो अलग-अलग कार्यों को चलाने के लिए संभव है यदि उनके लिए आवश्यक शर्तों को एक ही समय में पूरा किया जाए?क्या मैटलैब स्क्रिप्ट के लिए एक ही समय में दो अलग-अलग कार्यों को चलाने के लिए संभव है

इस उदाहरण में, मैं एक परियोजना के रूप में मैटलैब पर दो खिलाड़ी लड़ने वाला गेम बना रहा हूं: किसी भी समय यदि दोनों खिलाड़ी कूदने की कोशिश करते हैं।

अलग-अलग के माध्यम से इसे निष्पादित करना अगर उनके भीतर लूप के साथ बयान एक खिलाड़ी को मध्य हवा में रोकता है जबकि दूसरा अपनी कूद पूरी करता है और फिर पहला खिलाड़ी सामान्य रूप से अपनी कूद जारी रखता है।

वर्तमान में मैंने कार्यों को 'हार्डकोड' किया है और उन्हें कार्यों में परिवर्तित करना चाहते हैं।

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

if double(c(1)) == 30 && double(c(2)) == 0 && jump == 0 % up 
     jump=1; 
     for dt=0:18 
      dy=dy+20*0.1; 
      y = y + dy; 
      set(player,'Position',[x y w h]); 
      pause(0.07) 
      if double(c(1))==122 || double(c(2))==122 || double(c(3))==122 %check for punch 
       if abs(x-x2)<=64 && hit2==0 
        h2=h2-10; 
        hit2=1; 
        x=x; 
        if x<x2 
         x2=x2+2*dx; 
        elseif x>x2 
         x2=x2-2*dx; 
        end 
        if h2<=0 
         disp('YOU WIN'); 
        else 
         set(health2,'position',[640-h2 0 h2 20]) 
        end 
        set(player2,'position',[x2 y2 wp hp]) 
       end 
      elseif double(c(1))==120 || double(c(2))==120 || double(c(3))==120 %check for kick 
       if abs(x-x2)<=70 && hit2==0 
        h2=h2-15; 
        hit2=1; 
        x=x; 
        if x<x2 
         if x2>=580 
          x2=580; 
         elseif x2<580 
          x2=x2+6*dx; 
         end 
        elseif x>x2 
         if x2<=0; 
          x2=0; 
         elseif x2>0 
          x2=x2-6*dx; 
         end 
        end 
        if h2<=0 
         disp('YOU WIN'); 
        else 
         set(health2,'position',[640-h2 0 h2 20]) 
        end 
        set(player2,'position',[x2 y2 wp hp]) 
       end 
      end 
     end 
     dy=-dy; 
     y=126; 
     jump=0; 
     hit2=0; 
    end 
    if double(f(1))==105 && double(f(2))==0 && jump2 == 0 %player 2 up 
     jump2=1; 
     for dt2=0:1:18 
      dy2=dy2+20*0.1; 
      y2=y2+dy2; 
      set(player2,'position',[x2 y2 wp hp]); 
      pause(0.07) 
      if double(f(1))==103 || double(f(2))==103 || double(f(3))==103 %Player 2 check for punch 
       if abs(x-x2)<=64 && hit1==0 
        h1=h1-10; 
        hit1=1; 
        x2=x2; 
        if x<x2 
         if x>=580 
          x=580; 
         elseif x<580 
          x=x-2*dx; 
         end 
        elseif x>x2 
         if x<=0 
          x=0; 
         elseif x>0 
          x=x+2*dx; 
         end 
        end 
        if h1<=0 
         disp('Player 2 YOU WIN'); 
        else 
         set(health,'position',[0 0 h1 20]) 
        end 
        set(player2,'position',[x2 y2 wp hp]) 
       end 
      elseif double(f(1))==104 || double(f(2))==104 || double(f(3))==104 %check for kick 
       if abs(x-x2)<=70 && hit1==0 
        h1=h1-15; 
        hit1=1; 
        x=x; 
        if x<x2 
         if x>=580 
          x=580; 
         elseif x<580 
          x=x+6*dx; 
         end 
        elseif x>x2 
         if x<=0; 
          x=0; 
         elseif x>0 
          x=x-6*dx; 
         end 
        end 
        if h1<=0 
         disp('Player 2 YOU WIN'); 
        else 
         set(health1,'position',[0 0 h1 20]) 
        end 
        set(player,'position',[x y w h]) 
       end 
      end 
     end 
     dy2=-dy2; %#ok<*NASGU> 
     y2=126; 
     jump2=0; 
     hit1=0; 
    end 
+2

मैं एक अलग तरीके से इस को हल करने का सुझाव देते हैं मैच के लिए लगता है। किसी भी समय टी को देखते हुए, दिए गए कार्यों का एक सेट किया जाना चाहिए (ए खाली हो सकता है)। किए जाने वाले कार्यों को एकत्रित करें, फिर प्रदर्शन करें, और उसके बाद परिणाम दिखाएं। – mmgp

उत्तर

3

मैटलैब के लिए एक समय में 1 से अधिक फ़ंक्शन चलाने के लिए संभव नहीं है। Matlab एक सख्ती से एकल थ्रेडेड प्रोग्रामिंग वातावरण है, यानी, यह अनुक्रम में स्क्रिप्ट में कमांड निष्पादित करता है। उपयोगकर्ता मैटलैब में सीधे किसी भी बहु-थ्रेडेड कोड को लिख नहीं सकता है। कुछ अंतर्निहित मैटलैब do support multi-threading फ़ंक्शन करते हैं, और आप उदा। एक बहु थ्रेडेड एमएक्स फ़ंक्शन लिखें, लेकिन गंभीर सीमाएं हैं: मैटलैब एमएक्स इंटरफ़ेस (उदा।, स्मृति आवंटन) थ्रेड सुरक्षित नहीं है, इसलिए आप या तो एक थ्रेड में आवंटित करते हैं, या मैटलैब कार्यक्षमता के किसी भी कॉल से पहले बाधाओं का उपयोग करते हैं।

कभी-कभी आप किसी प्रोग्राम के निष्पादन को "बाधित" करने के लिए टाइमर कार्यक्षमता का उपयोग कर सकते हैं और औसत समय में कुछ कर सकते हैं, लेकिन किसी भी क्षण में अभी भी केवल एक निष्पादन पथ है।

इसके अलावा, आप समांतर प्रसंस्करण टूलबॉक्स में एकाधिक श्रमिकों को प्रारंभ कर सकते हैं। हालांकि, "मास्टर" स्क्रिप्ट अभी भी सिंगल थ्रेडेड है और श्रमिकों के पूरा होने के लिए श्रमिकों के पूरा होने की प्रतीक्षा करता है।

2

जो आप चाहते हैं उसे थ्रेडेड ऑपरेशंस कहा जाता है। Matlab ऐसी चीजों के लिए काफी सीमित समर्थन है, लेकिन कुछ है। विशेष रूप से, batch कमांड है। बेशक, यह मानता है कि आपके समांतर प्रसंस्करण टूलकिट है।

batch start_function 

सामान्य में, तथापि, एक ही बात एक और अधिक सावधान पाश, जहां पहले, कार्यों मिलता तो कार्रवाई ऐसा करने के द्वारा पूरा किया जा सकता है। यदि आप ध्यान से राज्यों का ट्रैक रखते हैं, तो कुछ फ़ंक्शन कई फ़्रेम के दौरान हो सकते हैं। इस में अपने कोड चालू करने के लिए जटिल हो जाएगा, लेकिन मैं आपको मूल विचार दिखाते हैं (यह कोड नहीं चलेगा, लेकिन आप मोटे तौर पर दिखाना चाहिए कि क्या करना है):

player1_jump=false 
player2_jump=false; 
while(true) 
    key=getKey(); 
    if key==PLAYER1_JUMP_KEY 
     player1_jump=true; 
    end 
    if key==PLAYER2_JUMP_KEY 
     player2_jump=true; 
    end 
    if player1_jump 
     %Move player 1 one step 
     if (done) %Put in your own criteria 
      player1_jump=false; 
     end 
    end 
    if player2_jump 
     %Move player 2 one step 
     if (done) %Put in your own criteria 
      player2_jump=false; 
     end 
    end 
end 

नोट आप करना होगा कि प्रत्येक खिलाड़ी को कूदने के लिए ट्रैक रखें, आदि। इसके अलावा, गुई को अपडेट करने के लिए एक छोटा विराम विवरण आवश्यक होगा। लेकिन सामान्य पैटर्न को पकड़ना चाहिए, और मैं आपको विवरणों को पूरा करने के लिए छोड़ दूंगा।

0

आप

parfor 

में देखना चाहते हो सकता है यह समानांतर में ऑपरेशनों को करने का एक तरीका है।मैं सकारात्मक है कि अगर यह है कि वास्तव में आप के लिए क्या देख रहे नहीं कर रहा हूँ, लेकिन यह अपने विवरण

http://www.mathworks.com/help/matlab/ref/parfor.html