Solved

Showing multiple MPEG files

Posted on 2004-04-12
20
370 Views
Last Modified: 2010-05-02
I have a VB 6.0 survey app I am trying to reconfigure to show multiple MPEG files.  The app reads a text file to display the questions and when it reaches the que for the video it currently shows one MPEG fine.  I want to show one master MPEG then show 15 small scenes randomly during the same session. I am using the windows media control and calling the video using the shellexecute command. My problem:  I can't get it to read the master MPEG first then enter a random series to show the 15 short clips.  It either shows only the master or starts the random series. Can this be done in VB 6? What I believe I need is a random number generator that always produces 1 first then the other 15 numbers are random.
0
Comment
Question by:wayneray
  • 10
  • 5
  • 3
  • +1
20 Comments
 
LVL 15

Expert Comment

by:unknown_routine
ID: 10805889
If you are trying to show more than one mpeg using VB6 i suppose this is not possible(except maybe by some very complicated method).

this is because VB6 does not support multithreading.
0
 

Author Comment

by:wayneray
ID: 10806575
I am not trying to show multiple mpegs at the same time.  I have 16 mpegs assigned to a variable array. I use a command button to randomly call the mpegs in my program and it will show them randomly each time I push the button but I cannot get mpeg #1 to show first followed by the other 15.  If there is a way to generate random numbers where the first number is always 1, that is what I need.  
0
 
LVL 15

Expert Comment

by:unknown_routine
ID: 10807510
you want the 1st random number to be 1?? that is not a random number.

if you  need to show the first member always then it should not created as a random number


if you can paste your code here I can help you more.


0
 
LVL 5

Accepted Solution

by:
nickaskew earned 250 total points
ID: 10812192
Hi Wayneray,

You need a method of establishing whether your program has shown the main video yet.

Define this global variable in your application:

Public bMainVidShown As Boolean

At the point in your program where it calculates which video to show - perform this test:

If (bMainVidShown=True) Then
 ' We have already shown the main video, calculate a random number between 1-15 and show the appropriate vid.
 ' YOUR CODE TO SHOW VIDEO 1 to 15 GOES HERE.
Else
 ' bMainVidShown is false, which means this is the first time this piece of code has run..
 ' YOUR CODE TO SHOW THE MAIN VIDEO GOES HERE.
 bMainVidShown = True  ' Set it to True so the next time this routine runs, it will know we have already shown the main video..
End If


Regards

Nick
0
 

Author Comment

by:wayneray
ID: 10812288
Here is the current code I am using as a workaround.  I commented out the random number piece of code and used "IF" statements to call each video.  I have another sub that calls this sub.  I am going to try Nick's idea. I think he is on to something.

Sub playvideo(q1 As String)


Dim tempAr(2 To 16)
Dim n As Integer
'n = 1
'Do
'      Randomize Timer
'      n = Rnd * 10 + 5
'   Loop While tempAr(n)
'   tempAr(n) = 1
'   If n = 1 Then
If cmdButton(n).Caption = "The Stepford Wives" Then
ShellExecute Me.hWnd, "open", videoversions(1), vbNull, vbNull, 1
End If
If cmdButton(n).Caption = "Segment A" Then
ShellExecute Me.hWnd, "open", videoversions(3), vbNull, vbNull, 1
  End If
If cmdButton(n).Caption = "Segment B" Then
ShellExecute Me.hWnd, "open", videoversions(2), vbNull, vbNull, 1
  End If
If cmdButton(n).Caption = "Segment C" Then
ShellExecute Me.hWnd, "open", videoversions(5), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment D" Then
ShellExecute Me.hWnd, "open", videoversions(7), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment E" Then
ShellExecute Me.hWnd, "open", videoversions(4), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment F" Then
ShellExecute Me.hWnd, "open", videoversions(6), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment G" Then
ShellExecute Me.hWnd, "open", videoversions(16), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment H" Then
ShellExecute Me.hWnd, "open", videoversions(12), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment I" Then
ShellExecute Me.hWnd, "open", videoversions(13), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment J" Then
ShellExecute Me.hWnd, "open", videoversions(9), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment K" Then
ShellExecute Me.hWnd, "open", videoversions(14), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment L" Then
ShellExecute Me.hWnd, "open", videoversions(8), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment M" Then
ShellExecute Me.hWnd, "open", videoversions(15), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment N" Then
ShellExecute Me.hWnd, "open", videoversions(11), vbNull, vbNull, 1
  End If
  If cmdButton(n).Caption = "Segment O" Then
ShellExecute Me.hWnd, "open", videoversions(10), vbNull, vbNull, 1
  End If



'ShellExecute Me.hWnd, "open", videoversions(n), vbNull, vbNull, 1

   
   


End Sub
0
 
LVL 7

Expert Comment

by:Burbble
ID: 10816358
>> If you are trying to show more than one mpeg using VB6 i
>> suppose this is not possible(except maybe by some very
>> complicated method).

>> this is because VB6 does not support multithreading.


It should definitely be possible to show more than one video simultaneously without multithreading, this is what the MSTASK.TSK file is for.

Also VB6 does support multithreading via API, see some examples here:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=14479&lngWId=1

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconCreatingMultithreadedTestApplication.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/html/vbconapartmentmodelmultithreadinginvisualbasic.asp

-Burbble
0
 
LVL 15

Expert Comment

by:unknown_routine
ID: 10816489
Hehe,
 Thanks for commenting on my comments!

I guess  wayneray Answered me that he does not want to watch 2 mpegs at the same time.

But admitingly those links you supplied are interesting, but I really don't think they belong to

beginer or even mid level VB(as they are mentioned as advanced by their authors).  And the most important thing is that all varieties are highly unstable,

1st and second example were crashed several times on my computer. This is a known problem when you try to simluate multithreading in VB.

0
 
LVL 7

Expert Comment

by:Burbble
ID: 10823591
Ooh, I misunderstood what wayneray was trying to accomplish here.

>> I am not trying to show multiple mpegs at the same time.

lol, I must have been asleep while I was reading this.

Just ignore me, I tend to ramble sometimes :D

-Burbble
0
 

Author Comment

by:wayneray
ID: 10824045
Nick your suggestion works fine.  I have a small problem with duplicate numbers being generated but that is fixable.  Thanks for your suggestion.
0
 
LVL 5

Expert Comment

by:nickaskew
ID: 10824520
Thanks Wayneray,

If you would like to post the code you eventually stuck with for generating the random numbers and selecting the videos, I wouldn't mind tidying it up for you - that way others viewing this question might get further help and you may end up with a solution you are totally happy with :)

Regards

Nick
0
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 

Author Comment

by:wayneray
ID: 10824771
This works great.  Just duplicates show up.

Sub playvideo(q1 As String)


Dim tempAr(2 To 16)
Dim n As Integer



If (bMainVidShown = True) Then
 ' We have already shown the main video, calculate a random number between 2-16 and show the appropriate vid.
 
  Do
      Randomize Timer
      n = Rnd * 10 + 5
   Loop While tempAr(n)
   tempAr(n) = 1
   
ShellExecute Me.hWnd, "open", videoversions(n), vbNull, vbNull, 1

 Else
 ' bMainVidShown is false, which means this is the first time this piece of code has run..
 ShellExecute Me.hWnd, "open", videoversions(1), vbNull, vbNull, 1
 bMainVidShown = True

End If
   
   
   


End Sub
0
 
LVL 5

Expert Comment

by:nickaskew
ID: 10826057
Hi Wayneray,

I have modified your original sub slightly and written a new function for you to use called UnusedRandom() which returns a random sequence of numbers without repeating (so it isn't exactly random.. but, ya know..)


Sub playvideo(q1 As String)
    Dim tempAr(2 To 16)
    Dim n As Integer
    '
    If (bMainVidShown = True) Then
        ' We have already shown the main video, calculate a random number between 2-16 and show the appropriate vid.
'        Do
'            Randomize Timer
'            n = Rnd * 10 + 5
'        Loop While tempAr(n)
'        tempAr(n) = 1
        '
        ShellExecute Me.hwnd, "open", videoversions(UnusedRandom(15) + 1), vbNull, vbNull, 1
        '
    Else
        ' bMainVidShown is false, which means this is the first time this piece of code has run..
        ' ShellExecute Me.hwnd, "open", videoversions(1), vbNull, vbNull, 1
        bMainVidShown = True
    End If
End Sub


' This function will return a random number between 1 and 'iKey'
' Providing iKey is the same from call to call, every number from 1 to iKey
' will be returned without repetition until the entire sequence of numbers
' have been returned, at which point the function resets itself and it begins
' dishing out 1 to iKey randomly again...
'
' Example:
' Dim iResult As Integer
' iResult = UnusedRandom(5)
'
' Possible Values for iResult = 1, 2, 3, 4 or 5.  In a random order that doesn't repeat until
' every number in the sequence has been returned.
'
Private Function UnusedRandom(ByVal iKey As Integer) As Integer
    Dim iTmpLoop As Integer
    Dim iTmpRandomNo As Integer
    Static iKeySize As Integer
    Static bUsedVals() As Boolean

    If (iKey < 1) Then
        MsgBox "Function UnusedRandom: Cannot accept a number less than 1, attempted to use [" & iKey & "]"
        UnusedRandom = -1
        Exit Function
    End If
    If (iKeySize <> iKey) Then
        '
        ' Either first time this function has been called, or random number
        ' maximum has been changed.
        '
        ' Allocate enough boolean vals to account for the maximum random
        ' number we have been asked to return.
        ReDim bUsedVals(iKey)
        iKeySize = iKey
        For iTmpLoop = 1 To iKeySize
            bUsedVals(iTmpLoop) = False
        Next
        iTmpRandomNo = Int((iKeySize * Rnd) + 1)
        bUsedVals(iTmpRandomNo) = True
        UnusedRandom = iTmpRandomNo
        Exit Function
    Else
        ' We have already created an array of size iKey, we have several
        ' things to check now:
        ' 1) first we see if we have already handed out every unique number
        '    we could, is so, we start the random number handout again.
        ' 2) we generate a random number and check whether we have handed it
        '    out already, if we have, we generate another and check.
        '
        ' Iterate through every member in the array, stop on the first one
        ' which is false - this proves we havn't handed out all the possible
        ' values yet, so we then go onto generate the number.
        For iTmpLoop = 1 To iKey
            If (bUsedVals(iTmpLoop) = False) Then
                ' Generate another number
                While True
                    iTmpRandomNo = Int((iKeySize * Rnd) + 1)
                    If (bUsedVals(iTmpRandomNo) = False) Then
                        ' We havn't used this number yet..
                        bUsedVals(iTmpRandomNo) = True
                        UnusedRandom = iTmpRandomNo
                        Exit Function
                    End If
                Wend
            End If
        Next
        '
        ' If we got this far, we must have already handed out every possible
        ' random number, lets erase the array and start again.
        '
        For iTmpLoop = 1 To iKeySize
            bUsedVals(iTmpLoop) = False
        Next
        iTmpRandomNo = Int((iKeySize * Rnd) + 1)
        bUsedVals(iTmpRandomNo) = True
        UnusedRandom = iTmpRandomNo
        Exit Function
    End If
End Function


Best Regards

Nick
0
 

Author Comment

by:wayneray
ID: 10827129
I tested your suggestion twice.  Both times it began duplicates after the first 8 numbers were generated.
0
 

Author Comment

by:wayneray
ID: 10827493
Nick,
 I really appreciate your help.  If I understand your function correctly, it should randomly generate numbers 1 through 15 and hand them out.  However, it is starting over after handing out the first 8.  Also, the last video is videoversions(16).  If I change the argument to 16, I get an out of range error.  The main video videoversions(1) can't be in the mix of random generated numbers.

Wayne
0
 
LVL 5

Expert Comment

by:nickaskew
ID: 10827666
Hi

I tripple checked the function, it definately presents the first batch of numbers randomly, without repeating, until it has run out, it then starts over.

The function generates random numbers from 1 to X, so if you want random numbers from 2-16, you should use UnusedRandom(15)+1, which would give you 2-16..

Make sure you always use the same KEY when you use UnusedRandom, the moment you change the key the existing list is erased and the random list starts over again.

This example source code uses the function, it shows you the numbers do not repeat until the entire series has been displayed.

http://www.nickaskew.com/ee/randomvids.zip

Regards

Nick
0
 

Author Comment

by:wayneray
ID: 10833090
Nick,
The problem maybe my program calls the video then goes back to another sub and asks three or four questions then comes back to playvideo().  I don't disagree with what you are saying.  I am just trying to discover why my program consistently only pulls 8 numbers then begins repeating.
0
 

Author Comment

by:wayneray
ID: 10836450
Nick,
I put a breakpoint in the UnusedRandom function and sure enough after 8 numbers it is resetting.

Wayne
0
 
LVL 5

Expert Comment

by:nickaskew
ID: 10837055
Wayne,

Did you download the ZIP I gave as a link above? - would you mind downloading it and opening it within your VB (it is source code only - 1 form) - Does it reset after 8? - I cannot replicate the problem you are having, I am really baffled!

Nick
0
 

Author Comment

by:wayneray
ID: 10837160
I did download it and it works fine.  Thanks for all your help. I have been put on another task for the moment.  If I don't get it fixed soon, I will give you a link my program and you can play with it.  I will have to remove some of my company stuff first.  It will probably be tomorrow before I can get to it.  Thanks again.
0
 

Author Comment

by:wayneray
ID: 10949044
Just wanted to let everyone know I fixed the repeating problem.  It was a VB thing.  The video array started with "1" instead of "0".  Once I changed that, it worked fine.  Thanks again for your help.
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

I’ve seen a number of people looking for examples of how to access web services from VB6.  I’ve been using a test harness I built in VB6 (using many resources I found online) that I use for small projects to work out how to communicate with web serv…
Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now