I put time-outs (or in the mist of whinning we call it quiet time) in effect before I yell. I tell my son to go to his room and he will finish dinner alone if he can not behave at the table with us. When he continues to act up then I remove him from the table, give him a time out (time equalivant to his age) and allow him to come back after the time out/done crying. At bath time I would attempt to do the same, finish the bath as quickly as possible, and put time-out in effect.
If you have not already started, it's a great stage to work on those manner words like please and thank you. My son has to ask using the word please with what he wants before he gets it. If it was a whinning tone, I would refuse to give it to him. (As long as it was something that could be withheld). If he cried, I would allow him to do so. After a few minutes he would calm down and then be more willing to ask. Frusterating...YES...but the outcome is wonderful. It makes you feel wonderful as a parent to hear how well behaved and polite your child is at school and while out to dinner.
Someone told me recently that you don't judge your children's behavior by how they act when only you are around, you judge them by how they act when others are around. I'm not saying they shouldn't be good at home as they are at school, but their behavior away at home reflects more of your parenting than when you are at home. If they know they can walk all over you, they will think that they can do it to everyone and will try. If they know what their limits really are, they will normally only try to push those limits at home. As a parent this is a hard thing to grasp because you want your child to be good for you like they do other people...but then again wouldn't you rather know that they are good for others rather than bad and troublesome?
Best wishes and hang in there! Enjoy the good times and praise them with hugs and kisses and excitement...:)