Date: Sat, 28 Jul 2001 09:51:45 +0300 From: "Eli Zaretskii" Sender: halo1 AT zahav DOT net DOT il To: "Rafal Maj (Raf256)" Message-Id: <3405-Sat28Jul2001095144+0300-eliz@is.elta.co.il> X-Mailer: Emacs 20.6 (via feedmail 8.3.emacs20_6 I) and Blat ver 1.8.9 CC: djgpp AT delorie DOT com In-reply-to: <9jthc4$l24$2@info.cyf-kr.edu.pl> (raf256@go2.pl) Subject: Re: Dos program with multitasking References: <9jthc4$l24$2 AT info DOT cyf-kr DOT edu DOT pl> Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk > From: "Rafal Maj (Raf256)" > Newsgroups: comp.os.msdos.djgpp > Date: Sat, 28 Jul 2001 07:05:18 +0200 > > Is there some possibility in DJGPP to run Dos program (16-bit, or 32-bit > make by DJGPP) and to continue in some way execution of main program in > background while spawned program is still running ? Not easily. The problem is that the DPMI spec explicitly prohibits switching stacks inside a hardware interrupt handler, so you cannot write a scheduler which switches tasks inside the timer tick interrupt handler. This issue was discussed several times, and the available paths to pull that trick are: - work around the DPMI limitation by writing code that exploits fine details of one specific DPMI server (probably CWSDPMI, since we have the sources); - limit the solution to Windows: then you could run the other program in a separate DOS box, and Windows handles the multitasking for you. The problem with this is that you cannot redirect standard streams of the child program in a normal way, and passing arguments and inheriting the environment variables is tricky; - multi-task not on timer ticks, but on system calls, like input or output from/to the screen. You could, for example, hook Int 31h, filter calls to Int 21h functions that do screen I/O, and switch between the two threads when that happens. This is suitable for applications where a child program is invoked to be fed some input, and the resulting output should go back to the parent; an example is Emacs which invokes GDB as part of its debugging interface. This solution is limited to DJGPP programs. Neither of these is simple, and there are various subtle points I didn't mention. It might be easier to write the multitasking shell as a real-mode program, which _can_ switch stacks inside the timer tick handler, and then run both programs from there. The poor-man solution for this problem is simply to open 2 or more DOS boxes on Windows ;-)