الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كود لتوليد حدث ما بتردد محدد

بدأه Sami Kouzoush في 2 مارس 2009 · 10 رد · 748 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــة ،،

الى من يستطيع المساعدة في كتابة كود لتوليد اي حدث مسبق(ضغط مفتاح مثلا)ولكن بعدد مرات معلوم وبتردد معلوم

على سبيل المثال لا الحصر فورم فيه تيكست بوكس و كوماند بوتوم

نكتب رقم في التيكست بوكس وعندما نضغط الزر يقوم بتوليد صوت بيب(او تغييير لون الفورم)او اي شيء ولكن بتردد يساوي العدد المكتوب في صندوق النص

استخدمت التايمر ولكن لم ينجح ذلك بالنسبةة للترددات العالية

ولكم جزيل الشكر

#2

الكود ادناه لعمل تكرار لشئ معين 10 مرات .. مثلا ظهور 10 رسالات


For i = 1 To 10
MsgBox i
Next
	Dim i As Integer

وهذا الذي ادناه هو هو ولكن في حالة اذا عدد التكرار موجود في Text1


For i = 1 To Val(Text1.Text)
MsgBox i
Next
	Dim i As Integer

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#3

شكراً لك اخي الكريم

ولكن في الكود اللي كتبتو حضرتك ستتكرر العملية 10 مرات

ولكن ما هو الزمن الازم لتكرارا العملية

علما ان سؤالي كان يركز على التردد

والتردد هو عدد مرات تكرار الشيء خلال الثانية

وفي الكود اللي كتبتو العملية تتم بشكل سريع وغير معروفة الزمن

انا اللي اطلبه هو

تكرار العملية عدد مرات محدد خلال زمن محدد

الكود Dim i As Integer

For i = 1 To 10

MsgBox i

Next

يكرر اظهار المسج بوكس 10 مرات

ولكن الزمن اللي تستغرقو العملية غير معروف للاسف

وبشكل اوضح يمكن انا بدي

مثلا تكرار اظهار المسج بوكس 10 مرات خلال 1 ثانية

يمكن تشكيلها بواسطة التايمر

ولكن لو اردنا تكرار العملية مثلا 1000000مرة خلال 1ثانية فهل هذا ممكن

ولكم جزيل الشكر

#4

كل ما عليك هو ظبط خاصية الـ Interval للـ Timer


Timer1.Interval = 100
End Sub
Private Sub Timer1_Timer()
Static Counter As Long

Counter = Counter + 1

If Counter <= 10 Then
MsgBox Counter
Else
Counter = 0
Timer1.Interval = 0
End If
End Sub
Private Sub Form_Load()

اما موضوع 1000000 مرة لكل واحد ثانية هذا .. فلا تقاس بهذا المقياس وتقاس بتكرار العملية كل وقت محدد

واذا افترضنا ان الثانية تحوي 1000 مللي ثانية .. اذا انت تريد ان يكون الـ Interval قيمته 0.001

طبعا مطلب غير منطقي بالمرة ولن يقبل الـ Timer به ولن يوافقك

وحتى ان وافقك .. أي عملية هذه التي تقبل ان تتم في هذا الوقت ؟؟

جرب الكود ادناه وانظر كم سيستغرق من الثواني


Me.Caption = i
Next
	For i = 1 To 1000000

وهو كود بسيط جدا .. فمبالك بان يكون اجراء متكامل مثلا والله اعلم بما سيكون فيه

ومن باب العلم بالشئ بالفعل يمكن الوصول الى طلبك .. ولكنه غير منطقي والافضل ان لا تضيع وقتك فيه

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#5

شكرا على تفاعلك المنطقي

اما التفاعل فهو جميل لانك قمت بلرد

واما المنطق فهو اني انا ذكرت ان ال timer لايمكن القيام بلمطلوب وانت اعدت نفس الكلام وذلك بقولك ان (اذا انت تريد ان يكون الـ Interval قيمته 0.001 طبعا مطلب غير منطقي بالمرة ولن يقبل الـ Timer به ولن يوافقك)

اعلم ان ال timer لا يقبل مثل هذه القيم

اما بلنسبة للعملية التي تقبل ان تتم بهذا الوقت وبهذا العدد فليكن خيالك اوسع من اظار msgbox وليكن مثلا جعل حالة رجل خرج لمنفذ الطابعة 1 منطقي ثم جعلها 0 منطقي وتكرار هذه العملية 100000000مرة خلال 1 ثانية

انا لا ابحث عن كيفية اخراج 1 او 0 منطقي على مخرج الطابعة التفرعي(كي لا تكتب لي الكود فهو بسيط) ولكن ابحث عن التكرار المحدد خلال زمن محدد

(ومن باب العلم بالشئ بالفعل يمكن الوصول الى طلبك .. ولكنه غير منطقي والافضل ان لا تضيع وقتك فيه)

بلنسة لك فهو غير منطقي ربما لان تفكيرك غير منطقي اما بلنسبة لي فهو كل المنطق

وارجو ان لا تضيع وقتك انت بلرد لانه سيكون غير منطقي ابدا

ملاحظة:

في عنوان الموضوع كتبت الى خبراء الفيجوال بيزك وليس الى المبتدئين

وشكرا على المنطق الرائع لردودك

#6

لا إله إلا الله

يحاول الأخ مساعدتك، ويكون هذا جوابك له.....

السرعة التي يعطيها الـTimer عند التردد الكبير جداً وهمية، فعندها لا فرق بين سرعة 1 و 10 و القيم الصغيرة كهذه، وهذا الأمر تجربة شخصية، فقد حاولت تسريع عملية بجعل سرعتها 1 بدلاً من 10، وكان من المفترض أن تتم أسرع بعشر مرات، لكنها تمت في الوقت نفسه، الـVisual Basic نفسه بطيء ولا يمكنه الوصول إلى سرعات كبيرة.

لا أريد إحباطك ولكن لا أظن ذلك ممكناً خصوصاً في بيئة Visual Basic ، ولكن حاول.

ولكن من المزعج أن نسمع منك هذا الكلام:

اقتباس
(ومن باب العلم بالشئ بالفعل يمكن الوصول الى طلبك .. ولكنه غير منطقي والافضل ان لا تضيع وقتك فيه)

بلنسة لك فهو غير منطقي ربما لان تفكيرك غير منطقي اما بلنسبة لي فهو كل المنطق

وارجو ان لا تضيع وقتك انت بلرد لانه سيكون غير منطقي ابدا

ملاحظة:

في عنوان الموضوع كتبت الى خبراء الفيجوال بيزك وليس الى المبتدئين

وشكرا على المنطق الرائع لردودك

وقد حاول mrx_Ta7ady مساعدتك، وكان السطر الأخير من كلامه إبداءً للرأي وليس إنقاصاً من قدرك أو قدر تفكيرك، ولكنك فهمته فهماً خاطئاً.

ووصفته بالمبتدئ، ولكن ما رأيك بإلقاء نظرة على ردوده وحله لمشاكل الآخرين لتحدد هل هو مبتدئ أو لا.

هذا الكلام كان يجب أن لا يصدر منك......

بالتوفيق.

هذه الجملة خاطئة  :wacko: 


#7

شكرا اخ ABOOOD

عندما تطرح فكرة وتنعت هذه الفكرة بانها غير منطقية ومضيعة للوقت فهذا يدل ان الذي وصفها بذلك اما غير منطقي او انه لم يفهم ابعاد الفكرة(وليس معيبا طلب الشرح)او انه يضيع وقته بالمنتدى

انا اقبل النقض لكن شرط ان يكون فعال,وليس من حق اي شخص بالمندى بان ينقض فكرة اي شخص اخر بانها غير منطقية او مضيعة للوقت حتى ولو كان مدير القسم

اما بلنسبة للتجربة التي قمت انت بها فانا قمت بها من قبل وسأضع الاكواد ليستفيد من التجربة الجميع علما ان البنامج بسيط جدا

الFORM يحتوي العناصر التالية بأسمائها الافتراضية

*6TEXTBOX

*3TIMER

*2COMMANDBUTTON

الاكواد:

GENERAL

Public x As Integer

Public y As Integer

Public z As Integer

Private Sub Command1_Click()

Timer1.Interval = Val(Text4.Text)

Timer2.Interval = Val(Text5.Text)

Timer3.Interval = Val(Text6.Text)

Timer1.Enabled = True

Timer2.Enabled = True

Timer3.Enabled = True

End Sub

Private Sub Command2_Click()

x = 0

y = 0

z = 0

Text1.Text = "0"

Text2.Text = "0"

Text3.Text = "0"

End Sub

Private Sub Form_Load()

x = 0

y = 0

z = 0

Text1.Text = "0"

Text2.Text = "0"

Text3.Text = "0"

Text4.Text = "1"

Text5.Text = "10"

Text6.Text = "1000"

Timer1.Enabled = False

Timer2.Enabled = False

Timer3.Enabled = False

Timer1.Interval = Val(Text4.Text)

Timer2.Interval = Val(Text5.Text)

Timer3.Interval = Val(Text6.Text)

End Sub

Private Sub Text3_Change()

If Text3.Text = 1 Then

Timer1.Enabled = False

Timer2.Enabled = False

Timer3.Enabled = False

End If

End Sub

Private Sub Timer1_Timer()

x = x + 1

Text1.Text = x

End Sub

Private Sub Timer2_Timer()

y = y + 1

Text2.Text = y

End Sub

Private Sub Timer3_Timer()

z = z + 1

Text3.Text = z

End Sub

نلاحظ عند الضغط على كوماند1 ان قيم المتحولين x,z

لهما نفس القيمة وهذا خير دليل عل ذلك

اظن ان العملية واضحة ولكن في حال عدم الوضوح انا جاهز للرد

ومشكور لتعاونكم

#8

بدأنا الآن نتفاهم، تجربتي ليست نفسها تماماً، ولكن نفس النتيجة.

ربما تكون هناك طرق أخرى غير الـTimer تستطيع إعطاءك سرعات كبيرة. بانتظار أحد الإخوة، وإن لم تجد الإجابة عند أحد، جرب طرحها في منتديات أجنبية مثلاً: VBForums أو Visual Basic Extreme Talk (الكتابة غير دقيقة)، لكن إن وجدت الإجابة ضعها لنا ، على كل حال إن شاء الله إن كان ذلك ممكناً تجد الإجابة هنا بإذن الله.

سوف أتابع الموضوع فأنا أحتاج له أيضاً.

وفقك الله.

هذه الجملة خاطئة  :wacko: 


#9

السلام عليكــم ورحمـة الله وبركاتــه ،،

اشكر مرورك الكريم على الموضوع

إن شاء الله سأحاول كتابة الكود باستخدام توابعapi وانا متفائل بهذه الطريقة وان تمت سارفعها الى المنتدى إن شاء الله

والسلام

#10

طريقة الـ API وبالتحديد دالة الـ SetTimer يكون الـ Elapse وهو الـ Interval من نوع Long .. لا تعليق

وسبق وقلت ان الطريقة جائزة .. الحل الوحيد هو إستخدام دالة الـ Timer

وهي دالة ترجع بالوقت الحالي بالـ Milliseconds وليس بالـ Seconds .. وهذا هو المطلوب

وعلى سبيل المثال لعمل Loop لكل 500 مللي ثانية .. اي كل نصف ثانية يتم تنفيذ عملية محددة


If Format(Timer - Int(Timer), "0.000") = "0.000" Or Format(Timer - Int(Timer), "0.000") = "0.500" Then
' Call your event here
End If
Loop
	Do

اما لعمل Loop لكل 1 مللي ثانية .. او لمنع تكرار العملية اكثر من مرة داخل الـ 1 مللي ثانية


Dim x2 As Double

Do
x1 = Format(Timer, "0.000")
If x1 <> x2 Then
x2 = x1
' Call your event here
End If
Loop
	Dim x1 As Double

ومشتاق صراحتا جدا لارى الاجراء الذي ينفذ عملية مرة كل 1 مللي ثانية .. كي اتعلم انا والمبتدئين امثالي

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#11

السلام عليكم ورحمة الله وبركاته

اخي العزيز حقيقتا انا لم استوعب سؤالك الحقيقة ولكن اذا اردت ان تستخدم نظام للوقت اكثر قوة من التيمر فعليك بدالة API

Get TickCount()

وهي فعلا قوية جدا جدا لدرجة انها تستطيع محاكات سرعة بيانات اللوحة الام وهي اسرع من التمير بحوالي 85 مره تخيل انت

وبالتوفيق إن شاء الله

العلم بين الحياء والكبرياء

مواضيع مشابهة